LCOV - code coverage report
Current view: top level - drivers/net/ethernet/broadcom - tg3.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 1 8873 0.1 %
Date: 2022-04-01 14:17:54 Functions: 1 322 0.3 %
Branches: 0 5661 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * tg3.c: Broadcom Tigon3 ethernet driver.
       3                 :            :  *
       4                 :            :  * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
       5                 :            :  * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)
       6                 :            :  * Copyright (C) 2004 Sun Microsystems Inc.
       7                 :            :  * Copyright (C) 2005-2016 Broadcom Corporation.
       8                 :            :  * Copyright (C) 2016-2017 Broadcom Limited.
       9                 :            :  * Copyright (C) 2018 Broadcom. All Rights Reserved. The term "Broadcom"
      10                 :            :  * refers to Broadcom Inc. and/or its subsidiaries.
      11                 :            :  *
      12                 :            :  * Firmware is:
      13                 :            :  *      Derived from proprietary unpublished source code,
      14                 :            :  *      Copyright (C) 2000-2016 Broadcom Corporation.
      15                 :            :  *      Copyright (C) 2016-2017 Broadcom Ltd.
      16                 :            :  *      Copyright (C) 2018 Broadcom. All Rights Reserved. The term "Broadcom"
      17                 :            :  *      refers to Broadcom Inc. and/or its subsidiaries.
      18                 :            :  *
      19                 :            :  *      Permission is hereby granted for the distribution of this firmware
      20                 :            :  *      data in hexadecimal or equivalent format, provided this copyright
      21                 :            :  *      notice is accompanying it.
      22                 :            :  */
      23                 :            : 
      24                 :            : 
      25                 :            : #include <linux/module.h>
      26                 :            : #include <linux/moduleparam.h>
      27                 :            : #include <linux/stringify.h>
      28                 :            : #include <linux/kernel.h>
      29                 :            : #include <linux/sched/signal.h>
      30                 :            : #include <linux/types.h>
      31                 :            : #include <linux/compiler.h>
      32                 :            : #include <linux/slab.h>
      33                 :            : #include <linux/delay.h>
      34                 :            : #include <linux/in.h>
      35                 :            : #include <linux/interrupt.h>
      36                 :            : #include <linux/ioport.h>
      37                 :            : #include <linux/pci.h>
      38                 :            : #include <linux/netdevice.h>
      39                 :            : #include <linux/etherdevice.h>
      40                 :            : #include <linux/skbuff.h>
      41                 :            : #include <linux/ethtool.h>
      42                 :            : #include <linux/mdio.h>
      43                 :            : #include <linux/mii.h>
      44                 :            : #include <linux/phy.h>
      45                 :            : #include <linux/brcmphy.h>
      46                 :            : #include <linux/if.h>
      47                 :            : #include <linux/if_vlan.h>
      48                 :            : #include <linux/ip.h>
      49                 :            : #include <linux/tcp.h>
      50                 :            : #include <linux/workqueue.h>
      51                 :            : #include <linux/prefetch.h>
      52                 :            : #include <linux/dma-mapping.h>
      53                 :            : #include <linux/firmware.h>
      54                 :            : #include <linux/ssb/ssb_driver_gige.h>
      55                 :            : #include <linux/hwmon.h>
      56                 :            : #include <linux/hwmon-sysfs.h>
      57                 :            : #include <linux/crc32poly.h>
      58                 :            : 
      59                 :            : #include <net/checksum.h>
      60                 :            : #include <net/ip.h>
      61                 :            : 
      62                 :            : #include <linux/io.h>
      63                 :            : #include <asm/byteorder.h>
      64                 :            : #include <linux/uaccess.h>
      65                 :            : 
      66                 :            : #include <uapi/linux/net_tstamp.h>
      67                 :            : #include <linux/ptp_clock_kernel.h>
      68                 :            : 
      69                 :            : #define BAR_0   0
      70                 :            : #define BAR_2   2
      71                 :            : 
      72                 :            : #include "tg3.h"
      73                 :            : 
      74                 :            : /* Functions & macros to verify TG3_FLAGS types */
      75                 :            : 
      76                 :          0 : static inline int _tg3_flag(enum TG3_FLAGS flag, unsigned long *bits)
      77                 :            : {
      78                 :          0 :         return test_bit(flag, bits);
      79                 :            : }
      80                 :            : 
      81                 :          0 : static inline void _tg3_flag_set(enum TG3_FLAGS flag, unsigned long *bits)
      82                 :            : {
      83                 :          0 :         set_bit(flag, bits);
      84                 :          0 : }
      85                 :            : 
      86                 :          0 : static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)
      87                 :            : {
      88                 :          0 :         clear_bit(flag, bits);
      89                 :          0 : }
      90                 :            : 
      91                 :            : #define tg3_flag(tp, flag)                              \
      92                 :            :         _tg3_flag(TG3_FLAG_##flag, (tp)->tg3_flags)
      93                 :            : #define tg3_flag_set(tp, flag)                          \
      94                 :            :         _tg3_flag_set(TG3_FLAG_##flag, (tp)->tg3_flags)
      95                 :            : #define tg3_flag_clear(tp, flag)                        \
      96                 :            :         _tg3_flag_clear(TG3_FLAG_##flag, (tp)->tg3_flags)
      97                 :            : 
      98                 :            : #define DRV_MODULE_NAME         "tg3"
      99                 :            : #define TG3_MAJ_NUM                     3
     100                 :            : #define TG3_MIN_NUM                     137
     101                 :            : #define DRV_MODULE_VERSION      \
     102                 :            :         __stringify(TG3_MAJ_NUM) "." __stringify(TG3_MIN_NUM)
     103                 :            : #define DRV_MODULE_RELDATE      "May 11, 2014"
     104                 :            : 
     105                 :            : #define RESET_KIND_SHUTDOWN     0
     106                 :            : #define RESET_KIND_INIT         1
     107                 :            : #define RESET_KIND_SUSPEND      2
     108                 :            : 
     109                 :            : #define TG3_DEF_RX_MODE         0
     110                 :            : #define TG3_DEF_TX_MODE         0
     111                 :            : #define TG3_DEF_MSG_ENABLE        \
     112                 :            :         (NETIF_MSG_DRV          | \
     113                 :            :          NETIF_MSG_PROBE        | \
     114                 :            :          NETIF_MSG_LINK         | \
     115                 :            :          NETIF_MSG_TIMER        | \
     116                 :            :          NETIF_MSG_IFDOWN       | \
     117                 :            :          NETIF_MSG_IFUP         | \
     118                 :            :          NETIF_MSG_RX_ERR       | \
     119                 :            :          NETIF_MSG_TX_ERR)
     120                 :            : 
     121                 :            : #define TG3_GRC_LCLCTL_PWRSW_DELAY      100
     122                 :            : 
     123                 :            : /* length of time before we decide the hardware is borked,
     124                 :            :  * and dev->tx_timeout() should be called to fix the problem
     125                 :            :  */
     126                 :            : 
     127                 :            : #define TG3_TX_TIMEOUT                  (5 * HZ)
     128                 :            : 
     129                 :            : /* hardware minimum and maximum for a single frame's data payload */
     130                 :            : #define TG3_MIN_MTU                     ETH_ZLEN
     131                 :            : #define TG3_MAX_MTU(tp) \
     132                 :            :         (tg3_flag(tp, JUMBO_CAPABLE) ? 9000 : 1500)
     133                 :            : 
     134                 :            : /* These numbers seem to be hard coded in the NIC firmware somehow.
     135                 :            :  * You can't change the ring sizes, but you can change where you place
     136                 :            :  * them in the NIC onboard memory.
     137                 :            :  */
     138                 :            : #define TG3_RX_STD_RING_SIZE(tp) \
     139                 :            :         (tg3_flag(tp, LRG_PROD_RING_CAP) ? \
     140                 :            :          TG3_RX_STD_MAX_SIZE_5717 : TG3_RX_STD_MAX_SIZE_5700)
     141                 :            : #define TG3_DEF_RX_RING_PENDING         200
     142                 :            : #define TG3_RX_JMB_RING_SIZE(tp) \
     143                 :            :         (tg3_flag(tp, LRG_PROD_RING_CAP) ? \
     144                 :            :          TG3_RX_JMB_MAX_SIZE_5717 : TG3_RX_JMB_MAX_SIZE_5700)
     145                 :            : #define TG3_DEF_RX_JUMBO_RING_PENDING   100
     146                 :            : 
     147                 :            : /* Do not place this n-ring entries value into the tp struct itself,
     148                 :            :  * we really want to expose these constants to GCC so that modulo et
     149                 :            :  * al.  operations are done with shifts and masks instead of with
     150                 :            :  * hw multiply/modulo instructions.  Another solution would be to
     151                 :            :  * replace things like '% foo' with '& (foo - 1)'.
     152                 :            :  */
     153                 :            : 
     154                 :            : #define TG3_TX_RING_SIZE                512
     155                 :            : #define TG3_DEF_TX_RING_PENDING         (TG3_TX_RING_SIZE - 1)
     156                 :            : 
     157                 :            : #define TG3_RX_STD_RING_BYTES(tp) \
     158                 :            :         (sizeof(struct tg3_rx_buffer_desc) * TG3_RX_STD_RING_SIZE(tp))
     159                 :            : #define TG3_RX_JMB_RING_BYTES(tp) \
     160                 :            :         (sizeof(struct tg3_ext_rx_buffer_desc) * TG3_RX_JMB_RING_SIZE(tp))
     161                 :            : #define TG3_RX_RCB_RING_BYTES(tp) \
     162                 :            :         (sizeof(struct tg3_rx_buffer_desc) * (tp->rx_ret_ring_mask + 1))
     163                 :            : #define TG3_TX_RING_BYTES       (sizeof(struct tg3_tx_buffer_desc) * \
     164                 :            :                                  TG3_TX_RING_SIZE)
     165                 :            : #define NEXT_TX(N)              (((N) + 1) & (TG3_TX_RING_SIZE - 1))
     166                 :            : 
     167                 :            : #define TG3_DMA_BYTE_ENAB               64
     168                 :            : 
     169                 :            : #define TG3_RX_STD_DMA_SZ               1536
     170                 :            : #define TG3_RX_JMB_DMA_SZ               9046
     171                 :            : 
     172                 :            : #define TG3_RX_DMA_TO_MAP_SZ(x)         ((x) + TG3_DMA_BYTE_ENAB)
     173                 :            : 
     174                 :            : #define TG3_RX_STD_MAP_SZ               TG3_RX_DMA_TO_MAP_SZ(TG3_RX_STD_DMA_SZ)
     175                 :            : #define TG3_RX_JMB_MAP_SZ               TG3_RX_DMA_TO_MAP_SZ(TG3_RX_JMB_DMA_SZ)
     176                 :            : 
     177                 :            : #define TG3_RX_STD_BUFF_RING_SIZE(tp) \
     178                 :            :         (sizeof(struct ring_info) * TG3_RX_STD_RING_SIZE(tp))
     179                 :            : 
     180                 :            : #define TG3_RX_JMB_BUFF_RING_SIZE(tp) \
     181                 :            :         (sizeof(struct ring_info) * TG3_RX_JMB_RING_SIZE(tp))
     182                 :            : 
     183                 :            : /* Due to a hardware bug, the 5701 can only DMA to memory addresses
     184                 :            :  * that are at least dword aligned when used in PCIX mode.  The driver
     185                 :            :  * works around this bug by double copying the packet.  This workaround
     186                 :            :  * is built into the normal double copy length check for efficiency.
     187                 :            :  *
     188                 :            :  * However, the double copy is only necessary on those architectures
     189                 :            :  * where unaligned memory accesses are inefficient.  For those architectures
     190                 :            :  * where unaligned memory accesses incur little penalty, we can reintegrate
     191                 :            :  * the 5701 in the normal rx path.  Doing so saves a device structure
     192                 :            :  * dereference by hardcoding the double copy threshold in place.
     193                 :            :  */
     194                 :            : #define TG3_RX_COPY_THRESHOLD           256
     195                 :            : #if NET_IP_ALIGN == 0 || defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
     196                 :            :         #define TG3_RX_COPY_THRESH(tp)  TG3_RX_COPY_THRESHOLD
     197                 :            : #else
     198                 :            :         #define TG3_RX_COPY_THRESH(tp)  ((tp)->rx_copy_thresh)
     199                 :            : #endif
     200                 :            : 
     201                 :            : #if (NET_IP_ALIGN != 0)
     202                 :            : #define TG3_RX_OFFSET(tp)       ((tp)->rx_offset)
     203                 :            : #else
     204                 :            : #define TG3_RX_OFFSET(tp)       (NET_SKB_PAD)
     205                 :            : #endif
     206                 :            : 
     207                 :            : /* minimum number of free TX descriptors required to wake up TX process */
     208                 :            : #define TG3_TX_WAKEUP_THRESH(tnapi)             ((tnapi)->tx_pending / 4)
     209                 :            : #define TG3_TX_BD_DMA_MAX_2K            2048
     210                 :            : #define TG3_TX_BD_DMA_MAX_4K            4096
     211                 :            : 
     212                 :            : #define TG3_RAW_IP_ALIGN 2
     213                 :            : 
     214                 :            : #define TG3_MAX_UCAST_ADDR(tp) (tg3_flag((tp), ENABLE_ASF) ? 2 : 3)
     215                 :            : #define TG3_UCAST_ADDR_IDX(tp) (tg3_flag((tp), ENABLE_ASF) ? 2 : 1)
     216                 :            : 
     217                 :            : #define TG3_FW_UPDATE_TIMEOUT_SEC       5
     218                 :            : #define TG3_FW_UPDATE_FREQ_SEC          (TG3_FW_UPDATE_TIMEOUT_SEC / 2)
     219                 :            : 
     220                 :            : #define FIRMWARE_TG3            "tigon/tg3.bin"
     221                 :            : #define FIRMWARE_TG357766       "tigon/tg357766.bin"
     222                 :            : #define FIRMWARE_TG3TSO         "tigon/tg3_tso.bin"
     223                 :            : #define FIRMWARE_TG3TSO5        "tigon/tg3_tso5.bin"
     224                 :            : 
     225                 :            : static char version[] =
     226                 :            :         DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")";
     227                 :            : 
     228                 :            : MODULE_AUTHOR("David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)");
     229                 :            : MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver");
     230                 :            : MODULE_LICENSE("GPL");
     231                 :            : MODULE_VERSION(DRV_MODULE_VERSION);
     232                 :            : MODULE_FIRMWARE(FIRMWARE_TG3);
     233                 :            : MODULE_FIRMWARE(FIRMWARE_TG3TSO);
     234                 :            : MODULE_FIRMWARE(FIRMWARE_TG3TSO5);
     235                 :            : 
     236                 :            : static int tg3_debug = -1;      /* -1 == use TG3_DEF_MSG_ENABLE as value */
     237                 :            : module_param(tg3_debug, int, 0);
     238                 :            : MODULE_PARM_DESC(tg3_debug, "Tigon3 bitmapped debugging message enable value");
     239                 :            : 
     240                 :            : #define TG3_DRV_DATA_FLAG_10_100_ONLY   0x0001
     241                 :            : #define TG3_DRV_DATA_FLAG_5705_10_100   0x0002
     242                 :            : 
     243                 :            : static const struct pci_device_id tg3_pci_tbl[] = {
     244                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700)},
     245                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701)},
     246                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702)},
     247                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703)},
     248                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704)},
     249                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE)},
     250                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705)},
     251                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705_2)},
     252                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M)},
     253                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M_2)},
     254                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X)},
     255                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X)},
     256                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S)},
     257                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702A3)},
     258                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703A3)},
     259                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782)},
     260                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788)},
     261                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5789)},
     262                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901),
     263                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY |
     264                 :            :                         TG3_DRV_DATA_FLAG_5705_10_100},
     265                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2),
     266                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY |
     267                 :            :                         TG3_DRV_DATA_FLAG_5705_10_100},
     268                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2)},
     269                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F),
     270                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY |
     271                 :            :                         TG3_DRV_DATA_FLAG_5705_10_100},
     272                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5721)},
     273                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5722)},
     274                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5750)},
     275                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751)},
     276                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751M)},
     277                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5751F),
     278                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     279                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752)},
     280                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5752M)},
     281                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753)},
     282                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753M)},
     283                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F),
     284                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     285                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754)},
     286                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M)},
     287                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755)},
     288                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M)},
     289                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5756)},
     290                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786)},
     291                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787)},
     292                 :            :         {PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5787M,
     293                 :            :                         PCI_VENDOR_ID_LENOVO,
     294                 :            :                         TG3PCI_SUBDEVICE_ID_LENOVO_5787M),
     295                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     296                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M)},
     297                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787F),
     298                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     299                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714)},
     300                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S)},
     301                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715)},
     302                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715S)},
     303                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780)},
     304                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S)},
     305                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781)},
     306                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906)},
     307                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906M)},
     308                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5784)},
     309                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5764)},
     310                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5723)},
     311                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761)},
     312                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5761E)},
     313                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761S)},
     314                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5761SE)},
     315                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_G)},
     316                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5785_F)},
     317                 :            :         {PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780,
     318                 :            :                         PCI_VENDOR_ID_AI, TG3PCI_SUBDEVICE_ID_ACER_57780_A),
     319                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     320                 :            :         {PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780,
     321                 :            :                         PCI_VENDOR_ID_AI, TG3PCI_SUBDEVICE_ID_ACER_57780_B),
     322                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     323                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57780)},
     324                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57760)},
     325                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57790),
     326                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     327                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57788)},
     328                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5717)},
     329                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5717_C)},
     330                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5718)},
     331                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57781)},
     332                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57785)},
     333                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57761)},
     334                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57765)},
     335                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57791),
     336                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     337                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57795),
     338                 :            :          .driver_data = TG3_DRV_DATA_FLAG_10_100_ONLY},
     339                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)},
     340                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)},
     341                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57762)},
     342                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57766)},
     343                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5762)},
     344                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5725)},
     345                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5727)},
     346                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57764)},
     347                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57767)},
     348                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57787)},
     349                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57782)},
     350                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57786)},
     351                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)},
     352                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)},
     353                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)},
     354                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1001)},
     355                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1003)},
     356                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC9100)},
     357                 :            :         {PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_TIGON3)},
     358                 :            :         {PCI_DEVICE(0x10cf, 0x11a2)}, /* Fujitsu 1000base-SX with BCM5703SKHB */
     359                 :            :         {}
     360                 :            : };
     361                 :            : 
     362                 :            : MODULE_DEVICE_TABLE(pci, tg3_pci_tbl);
     363                 :            : 
     364                 :            : static const struct {
     365                 :            :         const char string[ETH_GSTRING_LEN];
     366                 :            : } ethtool_stats_keys[] = {
     367                 :            :         { "rx_octets" },
     368                 :            :         { "rx_fragments" },
     369                 :            :         { "rx_ucast_packets" },
     370                 :            :         { "rx_mcast_packets" },
     371                 :            :         { "rx_bcast_packets" },
     372                 :            :         { "rx_fcs_errors" },
     373                 :            :         { "rx_align_errors" },
     374                 :            :         { "rx_xon_pause_rcvd" },
     375                 :            :         { "rx_xoff_pause_rcvd" },
     376                 :            :         { "rx_mac_ctrl_rcvd" },
     377                 :            :         { "rx_xoff_entered" },
     378                 :            :         { "rx_frame_too_long_errors" },
     379                 :            :         { "rx_jabbers" },
     380                 :            :         { "rx_undersize_packets" },
     381                 :            :         { "rx_in_length_errors" },
     382                 :            :         { "rx_out_length_errors" },
     383                 :            :         { "rx_64_or_less_octet_packets" },
     384                 :            :         { "rx_65_to_127_octet_packets" },
     385                 :            :         { "rx_128_to_255_octet_packets" },
     386                 :            :         { "rx_256_to_511_octet_packets" },
     387                 :            :         { "rx_512_to_1023_octet_packets" },
     388                 :            :         { "rx_1024_to_1522_octet_packets" },
     389                 :            :         { "rx_1523_to_2047_octet_packets" },
     390                 :            :         { "rx_2048_to_4095_octet_packets" },
     391                 :            :         { "rx_4096_to_8191_octet_packets" },
     392                 :            :         { "rx_8192_to_9022_octet_packets" },
     393                 :            : 
     394                 :            :         { "tx_octets" },
     395                 :            :         { "tx_collisions" },
     396                 :            : 
     397                 :            :         { "tx_xon_sent" },
     398                 :            :         { "tx_xoff_sent" },
     399                 :            :         { "tx_flow_control" },
     400                 :            :         { "tx_mac_errors" },
     401                 :            :         { "tx_single_collisions" },
     402                 :            :         { "tx_mult_collisions" },
     403                 :            :         { "tx_deferred" },
     404                 :            :         { "tx_excessive_collisions" },
     405                 :            :         { "tx_late_collisions" },
     406                 :            :         { "tx_collide_2times" },
     407                 :            :         { "tx_collide_3times" },
     408                 :            :         { "tx_collide_4times" },
     409                 :            :         { "tx_collide_5times" },
     410                 :            :         { "tx_collide_6times" },
     411                 :            :         { "tx_collide_7times" },
     412                 :            :         { "tx_collide_8times" },
     413                 :            :         { "tx_collide_9times" },
     414                 :            :         { "tx_collide_10times" },
     415                 :            :         { "tx_collide_11times" },
     416                 :            :         { "tx_collide_12times" },
     417                 :            :         { "tx_collide_13times" },
     418                 :            :         { "tx_collide_14times" },
     419                 :            :         { "tx_collide_15times" },
     420                 :            :         { "tx_ucast_packets" },
     421                 :            :         { "tx_mcast_packets" },
     422                 :            :         { "tx_bcast_packets" },
     423                 :            :         { "tx_carrier_sense_errors" },
     424                 :            :         { "tx_discards" },
     425                 :            :         { "tx_errors" },
     426                 :            : 
     427                 :            :         { "dma_writeq_full" },
     428                 :            :         { "dma_write_prioq_full" },
     429                 :            :         { "rxbds_empty" },
     430                 :            :         { "rx_discards" },
     431                 :            :         { "rx_errors" },
     432                 :            :         { "rx_threshold_hit" },
     433                 :            : 
     434                 :            :         { "dma_readq_full" },
     435                 :            :         { "dma_read_prioq_full" },
     436                 :            :         { "tx_comp_queue_full" },
     437                 :            : 
     438                 :            :         { "ring_set_send_prod_index" },
     439                 :            :         { "ring_status_update" },
     440                 :            :         { "nic_irqs" },
     441                 :            :         { "nic_avoided_irqs" },
     442                 :            :         { "nic_tx_threshold_hit" },
     443                 :            : 
     444                 :            :         { "mbuf_lwm_thresh_hit" },
     445                 :            : };
     446                 :            : 
     447                 :            : #define TG3_NUM_STATS   ARRAY_SIZE(ethtool_stats_keys)
     448                 :            : #define TG3_NVRAM_TEST          0
     449                 :            : #define TG3_LINK_TEST           1
     450                 :            : #define TG3_REGISTER_TEST       2
     451                 :            : #define TG3_MEMORY_TEST         3
     452                 :            : #define TG3_MAC_LOOPB_TEST      4
     453                 :            : #define TG3_PHY_LOOPB_TEST      5
     454                 :            : #define TG3_EXT_LOOPB_TEST      6
     455                 :            : #define TG3_INTERRUPT_TEST      7
     456                 :            : 
     457                 :            : 
     458                 :            : static const struct {
     459                 :            :         const char string[ETH_GSTRING_LEN];
     460                 :            : } ethtool_test_keys[] = {
     461                 :            :         [TG3_NVRAM_TEST]        = { "nvram test        (online) " },
     462                 :            :         [TG3_LINK_TEST]         = { "link test         (online) " },
     463                 :            :         [TG3_REGISTER_TEST]     = { "register test     (offline)" },
     464                 :            :         [TG3_MEMORY_TEST]       = { "memory test       (offline)" },
     465                 :            :         [TG3_MAC_LOOPB_TEST]    = { "mac loopback test (offline)" },
     466                 :            :         [TG3_PHY_LOOPB_TEST]    = { "phy loopback test (offline)" },
     467                 :            :         [TG3_EXT_LOOPB_TEST]    = { "ext loopback test (offline)" },
     468                 :            :         [TG3_INTERRUPT_TEST]    = { "interrupt test    (offline)" },
     469                 :            : };
     470                 :            : 
     471                 :            : #define TG3_NUM_TEST    ARRAY_SIZE(ethtool_test_keys)
     472                 :            : 
     473                 :            : 
     474                 :          0 : static void tg3_write32(struct tg3 *tp, u32 off, u32 val)
     475                 :            : {
     476                 :          0 :         writel(val, tp->regs + off);
     477                 :          0 : }
     478                 :            : 
     479                 :          0 : static u32 tg3_read32(struct tg3 *tp, u32 off)
     480                 :            : {
     481                 :          0 :         return readl(tp->regs + off);
     482                 :            : }
     483                 :            : 
     484                 :          0 : static void tg3_ape_write32(struct tg3 *tp, u32 off, u32 val)
     485                 :            : {
     486                 :          0 :         writel(val, tp->aperegs + off);
     487                 :          0 : }
     488                 :            : 
     489                 :          0 : static u32 tg3_ape_read32(struct tg3 *tp, u32 off)
     490                 :            : {
     491                 :          0 :         return readl(tp->aperegs + off);
     492                 :            : }
     493                 :            : 
     494                 :          0 : static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val)
     495                 :            : {
     496                 :          0 :         unsigned long flags;
     497                 :            : 
     498                 :          0 :         spin_lock_irqsave(&tp->indirect_lock, flags);
     499                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
     500                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
     501                 :          0 :         spin_unlock_irqrestore(&tp->indirect_lock, flags);
     502                 :          0 : }
     503                 :            : 
     504                 :          0 : static void tg3_write_flush_reg32(struct tg3 *tp, u32 off, u32 val)
     505                 :            : {
     506                 :          0 :         writel(val, tp->regs + off);
     507                 :          0 :         readl(tp->regs + off);
     508                 :          0 : }
     509                 :            : 
     510                 :          0 : static u32 tg3_read_indirect_reg32(struct tg3 *tp, u32 off)
     511                 :            : {
     512                 :          0 :         unsigned long flags;
     513                 :          0 :         u32 val;
     514                 :            : 
     515                 :          0 :         spin_lock_irqsave(&tp->indirect_lock, flags);
     516                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off);
     517                 :          0 :         pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val);
     518                 :          0 :         spin_unlock_irqrestore(&tp->indirect_lock, flags);
     519                 :          0 :         return val;
     520                 :            : }
     521                 :            : 
     522                 :          0 : static void tg3_write_indirect_mbox(struct tg3 *tp, u32 off, u32 val)
     523                 :            : {
     524                 :          0 :         unsigned long flags;
     525                 :            : 
     526         [ #  # ]:          0 :         if (off == (MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW)) {
     527                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_RCV_RET_RING_CON_IDX +
     528                 :            :                                        TG3_64BIT_REG_LOW, val);
     529                 :          0 :                 return;
     530                 :            :         }
     531         [ #  # ]:          0 :         if (off == TG3_RX_STD_PROD_IDX_REG) {
     532                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_STD_RING_PROD_IDX +
     533                 :            :                                        TG3_64BIT_REG_LOW, val);
     534                 :          0 :                 return;
     535                 :            :         }
     536                 :            : 
     537                 :          0 :         spin_lock_irqsave(&tp->indirect_lock, flags);
     538                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600);
     539                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_REG_DATA, val);
     540                 :          0 :         spin_unlock_irqrestore(&tp->indirect_lock, flags);
     541                 :            : 
     542                 :            :         /* In indirect mode when disabling interrupts, we also need
     543                 :            :          * to clear the interrupt bit in the GRC local ctrl register.
     544                 :            :          */
     545                 :          0 :         if ((off == (MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW)) &&
     546         [ #  # ]:          0 :             (val == 0x1)) {
     547                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MISC_LOCAL_CTRL,
     548                 :          0 :                                        tp->grc_local_ctrl|GRC_LCLCTRL_CLEARINT);
     549                 :            :         }
     550                 :            : }
     551                 :            : 
     552                 :          0 : static u32 tg3_read_indirect_mbox(struct tg3 *tp, u32 off)
     553                 :            : {
     554                 :          0 :         unsigned long flags;
     555                 :          0 :         u32 val;
     556                 :            : 
     557                 :          0 :         spin_lock_irqsave(&tp->indirect_lock, flags);
     558                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_REG_BASE_ADDR, off + 0x5600);
     559                 :          0 :         pci_read_config_dword(tp->pdev, TG3PCI_REG_DATA, &val);
     560                 :          0 :         spin_unlock_irqrestore(&tp->indirect_lock, flags);
     561                 :          0 :         return val;
     562                 :            : }
     563                 :            : 
     564                 :            : /* usec_wait specifies the wait time in usec when writing to certain registers
     565                 :            :  * where it is unsafe to read back the register without some delay.
     566                 :            :  * GRC_LOCAL_CTRL is one example if the GPIOs are toggled to switch power.
     567                 :            :  * TG3PCI_CLOCK_CTRL is another example if the clock frequencies are changed.
     568                 :            :  */
     569                 :          0 : static void _tw32_flush(struct tg3 *tp, u32 off, u32 val, u32 usec_wait)
     570                 :            : {
     571   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, PCIX_TARGET_HWBUG) || tg3_flag(tp, ICH_WORKAROUND))
     572                 :            :                 /* Non-posted methods */
     573                 :          0 :                 tp->write32(tp, off, val);
     574                 :            :         else {
     575                 :            :                 /* Posted method */
     576                 :          0 :                 tg3_write32(tp, off, val);
     577         [ #  # ]:          0 :                 if (usec_wait)
     578   [ #  #  #  # ]:          0 :                         udelay(usec_wait);
     579                 :          0 :                 tp->read32(tp, off);
     580                 :            :         }
     581                 :            :         /* Wait again after the read for the posted method to guarantee that
     582                 :            :          * the wait time is met.
     583                 :            :          */
     584         [ #  # ]:          0 :         if (usec_wait)
     585   [ #  #  #  # ]:          0 :                 udelay(usec_wait);
     586                 :          0 : }
     587                 :            : 
     588                 :          0 : static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val)
     589                 :            : {
     590                 :          0 :         tp->write32_mbox(tp, off, val);
     591   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, FLUSH_POSTED_WRITES) ||
     592         [ #  # ]:          0 :             (!tg3_flag(tp, MBOX_WRITE_REORDER) &&
     593                 :            :              !tg3_flag(tp, ICH_WORKAROUND)))
     594                 :          0 :                 tp->read32_mbox(tp, off);
     595                 :          0 : }
     596                 :            : 
     597                 :          0 : static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val)
     598                 :            : {
     599                 :          0 :         void __iomem *mbox = tp->regs + off;
     600                 :          0 :         writel(val, mbox);
     601         [ #  # ]:          0 :         if (tg3_flag(tp, TXD_MBOX_HWBUG))
     602                 :          0 :                 writel(val, mbox);
     603   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, MBOX_WRITE_REORDER) ||
     604                 :            :             tg3_flag(tp, FLUSH_POSTED_WRITES))
     605                 :          0 :                 readl(mbox);
     606                 :          0 : }
     607                 :            : 
     608                 :          0 : static u32 tg3_read32_mbox_5906(struct tg3 *tp, u32 off)
     609                 :            : {
     610                 :          0 :         return readl(tp->regs + off + GRCMBOX_BASE);
     611                 :            : }
     612                 :            : 
     613                 :          0 : static void tg3_write32_mbox_5906(struct tg3 *tp, u32 off, u32 val)
     614                 :            : {
     615                 :          0 :         writel(val, tp->regs + off + GRCMBOX_BASE);
     616                 :          0 : }
     617                 :            : 
     618                 :            : #define tw32_mailbox(reg, val)          tp->write32_mbox(tp, reg, val)
     619                 :            : #define tw32_mailbox_f(reg, val)        tw32_mailbox_flush(tp, (reg), (val))
     620                 :            : #define tw32_rx_mbox(reg, val)          tp->write32_rx_mbox(tp, reg, val)
     621                 :            : #define tw32_tx_mbox(reg, val)          tp->write32_tx_mbox(tp, reg, val)
     622                 :            : #define tr32_mailbox(reg)               tp->read32_mbox(tp, reg)
     623                 :            : 
     624                 :            : #define tw32(reg, val)                  tp->write32(tp, reg, val)
     625                 :            : #define tw32_f(reg, val)                _tw32_flush(tp, (reg), (val), 0)
     626                 :            : #define tw32_wait_f(reg, val, us)       _tw32_flush(tp, (reg), (val), (us))
     627                 :            : #define tr32(reg)                       tp->read32(tp, reg)
     628                 :            : 
     629                 :          0 : static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
     630                 :            : {
     631                 :          0 :         unsigned long flags;
     632                 :            : 
     633         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906 &&
     634         [ #  # ]:          0 :             (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC))
     635                 :            :                 return;
     636                 :            : 
     637                 :          0 :         spin_lock_irqsave(&tp->indirect_lock, flags);
     638         [ #  # ]:          0 :         if (tg3_flag(tp, SRAM_USE_CONFIG)) {
     639                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
     640                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
     641                 :            : 
     642                 :            :                 /* Always leave this as zero. */
     643                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
     644                 :            :         } else {
     645                 :          0 :                 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
     646                 :          0 :                 tw32_f(TG3PCI_MEM_WIN_DATA, val);
     647                 :            : 
     648                 :            :                 /* Always leave this as zero. */
     649                 :          0 :                 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
     650                 :            :         }
     651                 :          0 :         spin_unlock_irqrestore(&tp->indirect_lock, flags);
     652                 :            : }
     653                 :            : 
     654                 :          0 : static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val)
     655                 :            : {
     656                 :          0 :         unsigned long flags;
     657                 :            : 
     658         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906 &&
     659         [ #  # ]:          0 :             (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) {
     660                 :          0 :                 *val = 0;
     661                 :          0 :                 return;
     662                 :            :         }
     663                 :            : 
     664                 :          0 :         spin_lock_irqsave(&tp->indirect_lock, flags);
     665         [ #  # ]:          0 :         if (tg3_flag(tp, SRAM_USE_CONFIG)) {
     666                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
     667                 :          0 :                 pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
     668                 :            : 
     669                 :            :                 /* Always leave this as zero. */
     670                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
     671                 :            :         } else {
     672                 :          0 :                 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
     673                 :          0 :                 *val = tr32(TG3PCI_MEM_WIN_DATA);
     674                 :            : 
     675                 :            :                 /* Always leave this as zero. */
     676                 :          0 :                 tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
     677                 :            :         }
     678                 :          0 :         spin_unlock_irqrestore(&tp->indirect_lock, flags);
     679                 :            : }
     680                 :            : 
     681                 :          0 : static void tg3_ape_lock_init(struct tg3 *tp)
     682                 :            : {
     683                 :          0 :         int i;
     684                 :          0 :         u32 regbase, bit;
     685                 :            : 
     686         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5761)
     687                 :            :                 regbase = TG3_APE_LOCK_GRANT;
     688                 :            :         else
     689                 :          0 :                 regbase = TG3_APE_PER_LOCK_GRANT;
     690                 :            : 
     691                 :            :         /* Make sure the driver hasn't any stale locks. */
     692         [ #  # ]:          0 :         for (i = TG3_APE_LOCK_PHY0; i <= TG3_APE_LOCK_GPIO; i++) {
     693         [ #  # ]:          0 :                 switch (i) {
     694                 :            :                 case TG3_APE_LOCK_PHY0:
     695                 :            :                 case TG3_APE_LOCK_PHY1:
     696                 :            :                 case TG3_APE_LOCK_PHY2:
     697                 :            :                 case TG3_APE_LOCK_PHY3:
     698                 :            :                         bit = APE_LOCK_GRANT_DRIVER;
     699                 :            :                         break;
     700                 :          0 :                 default:
     701         [ #  # ]:          0 :                         if (!tp->pci_fn)
     702                 :            :                                 bit = APE_LOCK_GRANT_DRIVER;
     703                 :            :                         else
     704                 :          0 :                                 bit = 1 << tp->pci_fn;
     705                 :            :                 }
     706                 :          0 :                 tg3_ape_write32(tp, regbase + 4 * i, bit);
     707                 :            :         }
     708                 :            : 
     709                 :          0 : }
     710                 :            : 
     711                 :          0 : static int tg3_ape_lock(struct tg3 *tp, int locknum)
     712                 :            : {
     713                 :          0 :         int i, off;
     714                 :          0 :         int ret = 0;
     715                 :          0 :         u32 status, req, gnt, bit;
     716                 :            : 
     717         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_APE))
     718                 :            :                 return 0;
     719                 :            : 
     720   [ #  #  #  # ]:          0 :         switch (locknum) {
     721                 :          0 :         case TG3_APE_LOCK_GPIO:
     722         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5761)
     723                 :            :                         return 0;
     724                 :            :                 /* fall through */
     725                 :            :         case TG3_APE_LOCK_GRC:
     726                 :            :         case TG3_APE_LOCK_MEM:
     727         [ #  # ]:          0 :                 if (!tp->pci_fn)
     728                 :            :                         bit = APE_LOCK_REQ_DRIVER;
     729                 :            :                 else
     730                 :          0 :                         bit = 1 << tp->pci_fn;
     731                 :            :                 break;
     732                 :            :         case TG3_APE_LOCK_PHY0:
     733                 :            :         case TG3_APE_LOCK_PHY1:
     734                 :            :         case TG3_APE_LOCK_PHY2:
     735                 :            :         case TG3_APE_LOCK_PHY3:
     736                 :            :                 bit = APE_LOCK_REQ_DRIVER;
     737                 :            :                 break;
     738                 :            :         default:
     739                 :            :                 return -EINVAL;
     740                 :            :         }
     741                 :            : 
     742         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5761) {
     743                 :            :                 req = TG3_APE_LOCK_REQ;
     744                 :            :                 gnt = TG3_APE_LOCK_GRANT;
     745                 :            :         } else {
     746                 :          0 :                 req = TG3_APE_PER_LOCK_REQ;
     747                 :          0 :                 gnt = TG3_APE_PER_LOCK_GRANT;
     748                 :            :         }
     749                 :            : 
     750                 :          0 :         off = 4 * locknum;
     751                 :            : 
     752                 :          0 :         tg3_ape_write32(tp, req + off, bit);
     753                 :            : 
     754                 :            :         /* Wait for up to 1 millisecond to acquire lock. */
     755         [ #  # ]:          0 :         for (i = 0; i < 100; i++) {
     756                 :          0 :                 status = tg3_ape_read32(tp, gnt + off);
     757         [ #  # ]:          0 :                 if (status == bit)
     758                 :            :                         break;
     759         [ #  # ]:          0 :                 if (pci_channel_offline(tp->pdev))
     760                 :            :                         break;
     761                 :            : 
     762                 :          0 :                 udelay(10);
     763                 :            :         }
     764                 :            : 
     765         [ #  # ]:          0 :         if (status != bit) {
     766                 :            :                 /* Revoke the lock request. */
     767                 :          0 :                 tg3_ape_write32(tp, gnt + off, bit);
     768                 :          0 :                 ret = -EBUSY;
     769                 :            :         }
     770                 :            : 
     771                 :            :         return ret;
     772                 :            : }
     773                 :            : 
     774                 :          0 : static void tg3_ape_unlock(struct tg3 *tp, int locknum)
     775                 :            : {
     776                 :          0 :         u32 gnt, bit;
     777                 :            : 
     778         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_APE))
     779                 :            :                 return;
     780                 :            : 
     781   [ #  #  #  # ]:          0 :         switch (locknum) {
     782                 :          0 :         case TG3_APE_LOCK_GPIO:
     783         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5761)
     784                 :            :                         return;
     785                 :            :                 /* fall through */
     786                 :            :         case TG3_APE_LOCK_GRC:
     787                 :            :         case TG3_APE_LOCK_MEM:
     788         [ #  # ]:          0 :                 if (!tp->pci_fn)
     789                 :            :                         bit = APE_LOCK_GRANT_DRIVER;
     790                 :            :                 else
     791                 :          0 :                         bit = 1 << tp->pci_fn;
     792                 :            :                 break;
     793                 :            :         case TG3_APE_LOCK_PHY0:
     794                 :            :         case TG3_APE_LOCK_PHY1:
     795                 :            :         case TG3_APE_LOCK_PHY2:
     796                 :            :         case TG3_APE_LOCK_PHY3:
     797                 :            :                 bit = APE_LOCK_GRANT_DRIVER;
     798                 :            :                 break;
     799                 :            :         default:
     800                 :            :                 return;
     801                 :            :         }
     802                 :            : 
     803         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5761)
     804                 :            :                 gnt = TG3_APE_LOCK_GRANT;
     805                 :            :         else
     806                 :          0 :                 gnt = TG3_APE_PER_LOCK_GRANT;
     807                 :            : 
     808                 :          0 :         tg3_ape_write32(tp, gnt + 4 * locknum, bit);
     809                 :            : }
     810                 :            : 
     811                 :          0 : static int tg3_ape_event_lock(struct tg3 *tp, u32 timeout_us)
     812                 :            : {
     813                 :          0 :         u32 apedata;
     814                 :            : 
     815         [ #  # ]:          0 :         while (timeout_us) {
     816         [ #  # ]:          0 :                 if (tg3_ape_lock(tp, TG3_APE_LOCK_MEM))
     817                 :            :                         return -EBUSY;
     818                 :            : 
     819                 :          0 :                 apedata = tg3_ape_read32(tp, TG3_APE_EVENT_STATUS);
     820         [ #  # ]:          0 :                 if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING))
     821                 :            :                         break;
     822                 :            : 
     823                 :          0 :                 tg3_ape_unlock(tp, TG3_APE_LOCK_MEM);
     824                 :            : 
     825                 :          0 :                 udelay(10);
     826                 :          0 :                 timeout_us -= (timeout_us > 10) ? 10 : timeout_us;
     827                 :            :         }
     828                 :            : 
     829         [ #  # ]:          0 :         return timeout_us ? 0 : -EBUSY;
     830                 :            : }
     831                 :            : 
     832                 :            : #ifdef CONFIG_TIGON3_HWMON
     833                 :          0 : static int tg3_ape_wait_for_event(struct tg3 *tp, u32 timeout_us)
     834                 :            : {
     835                 :            :         u32 i, apedata;
     836                 :            : 
     837         [ #  # ]:          0 :         for (i = 0; i < timeout_us / 10; i++) {
     838                 :          0 :                 apedata = tg3_ape_read32(tp, TG3_APE_EVENT_STATUS);
     839                 :            : 
     840         [ #  # ]:          0 :                 if (!(apedata & APE_EVENT_STATUS_EVENT_PENDING))
     841                 :            :                         break;
     842                 :            : 
     843                 :          0 :                 udelay(10);
     844                 :            :         }
     845                 :            : 
     846                 :          0 :         return i == timeout_us / 10;
     847                 :            : }
     848                 :            : 
     849                 :          0 : static int tg3_ape_scratchpad_read(struct tg3 *tp, u32 *data, u32 base_off,
     850                 :            :                                    u32 len)
     851                 :            : {
     852                 :          0 :         int err;
     853                 :          0 :         u32 i, bufoff, msgoff, maxlen, apedata;
     854                 :            : 
     855         [ #  # ]:          0 :         if (!tg3_flag(tp, APE_HAS_NCSI))
     856                 :            :                 return 0;
     857                 :            : 
     858                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG);
     859         [ #  # ]:          0 :         if (apedata != APE_SEG_SIG_MAGIC)
     860                 :            :                 return -ENODEV;
     861                 :            : 
     862                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS);
     863         [ #  # ]:          0 :         if (!(apedata & APE_FW_STATUS_READY))
     864                 :            :                 return -EAGAIN;
     865                 :            : 
     866                 :          0 :         bufoff = tg3_ape_read32(tp, TG3_APE_SEG_MSG_BUF_OFF) +
     867                 :            :                  TG3_APE_SHMEM_BASE;
     868                 :          0 :         msgoff = bufoff + 2 * sizeof(u32);
     869                 :          0 :         maxlen = tg3_ape_read32(tp, TG3_APE_SEG_MSG_BUF_LEN);
     870                 :            : 
     871         [ #  # ]:          0 :         while (len) {
     872                 :          0 :                 u32 length;
     873                 :            : 
     874                 :            :                 /* Cap xfer sizes to scratchpad limits. */
     875                 :          0 :                 length = (len > maxlen) ? maxlen : len;
     876                 :          0 :                 len -= length;
     877                 :            : 
     878                 :          0 :                 apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS);
     879         [ #  # ]:          0 :                 if (!(apedata & APE_FW_STATUS_READY))
     880                 :            :                         return -EAGAIN;
     881                 :            : 
     882                 :            :                 /* Wait for up to 1 msec for APE to service previous event. */
     883                 :          0 :                 err = tg3_ape_event_lock(tp, 1000);
     884         [ #  # ]:          0 :                 if (err)
     885                 :          0 :                         return err;
     886                 :            : 
     887                 :          0 :                 apedata = APE_EVENT_STATUS_DRIVER_EVNT |
     888                 :            :                           APE_EVENT_STATUS_SCRTCHPD_READ |
     889                 :            :                           APE_EVENT_STATUS_EVENT_PENDING;
     890                 :          0 :                 tg3_ape_write32(tp, TG3_APE_EVENT_STATUS, apedata);
     891                 :            : 
     892                 :          0 :                 tg3_ape_write32(tp, bufoff, base_off);
     893                 :          0 :                 tg3_ape_write32(tp, bufoff + sizeof(u32), length);
     894                 :            : 
     895                 :          0 :                 tg3_ape_unlock(tp, TG3_APE_LOCK_MEM);
     896                 :          0 :                 tg3_ape_write32(tp, TG3_APE_EVENT, APE_EVENT_1);
     897                 :            : 
     898                 :          0 :                 base_off += length;
     899                 :            : 
     900         [ #  # ]:          0 :                 if (tg3_ape_wait_for_event(tp, 30000))
     901                 :            :                         return -EAGAIN;
     902                 :            : 
     903         [ #  # ]:          0 :                 for (i = 0; length; i += 4, length -= 4) {
     904                 :          0 :                         u32 val = tg3_ape_read32(tp, msgoff + i);
     905                 :          0 :                         memcpy(data, &val, sizeof(u32));
     906                 :          0 :                         data++;
     907                 :            :                 }
     908                 :            :         }
     909                 :            : 
     910                 :            :         return 0;
     911                 :            : }
     912                 :            : #endif
     913                 :            : 
     914                 :          0 : static int tg3_ape_send_event(struct tg3 *tp, u32 event)
     915                 :            : {
     916                 :          0 :         int err;
     917                 :          0 :         u32 apedata;
     918                 :            : 
     919                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG);
     920         [ #  # ]:          0 :         if (apedata != APE_SEG_SIG_MAGIC)
     921                 :            :                 return -EAGAIN;
     922                 :            : 
     923                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS);
     924         [ #  # ]:          0 :         if (!(apedata & APE_FW_STATUS_READY))
     925                 :            :                 return -EAGAIN;
     926                 :            : 
     927                 :            :         /* Wait for up to 20 millisecond for APE to service previous event. */
     928                 :          0 :         err = tg3_ape_event_lock(tp, 20000);
     929         [ #  # ]:          0 :         if (err)
     930                 :            :                 return err;
     931                 :            : 
     932                 :          0 :         tg3_ape_write32(tp, TG3_APE_EVENT_STATUS,
     933                 :            :                         event | APE_EVENT_STATUS_EVENT_PENDING);
     934                 :            : 
     935                 :          0 :         tg3_ape_unlock(tp, TG3_APE_LOCK_MEM);
     936                 :          0 :         tg3_ape_write32(tp, TG3_APE_EVENT, APE_EVENT_1);
     937                 :            : 
     938                 :          0 :         return 0;
     939                 :            : }
     940                 :            : 
     941                 :          0 : static void tg3_ape_driver_state_change(struct tg3 *tp, int kind)
     942                 :            : {
     943                 :          0 :         u32 event;
     944                 :          0 :         u32 apedata;
     945                 :            : 
     946         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_APE))
     947                 :            :                 return;
     948                 :            : 
     949      [ #  #  # ]:          0 :         switch (kind) {
     950                 :          0 :         case RESET_KIND_INIT:
     951                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_COUNT, tp->ape_hb++);
     952                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_SEG_SIG,
     953                 :            :                                 APE_HOST_SEG_SIG_MAGIC);
     954                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_SEG_LEN,
     955                 :            :                                 APE_HOST_SEG_LEN_MAGIC);
     956                 :          0 :                 apedata = tg3_ape_read32(tp, TG3_APE_HOST_INIT_COUNT);
     957                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_INIT_COUNT, ++apedata);
     958                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_DRIVER_ID,
     959                 :            :                         APE_HOST_DRIVER_ID_MAGIC(TG3_MAJ_NUM, TG3_MIN_NUM));
     960                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_BEHAVIOR,
     961                 :            :                                 APE_HOST_BEHAV_NO_PHYLOCK);
     962                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_DRVR_STATE,
     963                 :            :                                     TG3_APE_HOST_DRVR_STATE_START);
     964                 :            : 
     965                 :          0 :                 event = APE_EVENT_STATUS_STATE_START;
     966                 :          0 :                 break;
     967                 :          0 :         case RESET_KIND_SHUTDOWN:
     968   [ #  #  #  #  :          0 :                 if (device_may_wakeup(&tp->pdev->dev) &&
                   #  # ]
     969                 :            :                     tg3_flag(tp, WOL_ENABLE)) {
     970                 :          0 :                         tg3_ape_write32(tp, TG3_APE_HOST_WOL_SPEED,
     971                 :            :                                             TG3_APE_HOST_WOL_SPEED_AUTO);
     972                 :          0 :                         apedata = TG3_APE_HOST_DRVR_STATE_WOL;
     973                 :            :                 } else
     974                 :            :                         apedata = TG3_APE_HOST_DRVR_STATE_UNLOAD;
     975                 :            : 
     976                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_DRVR_STATE, apedata);
     977                 :            : 
     978                 :          0 :                 event = APE_EVENT_STATUS_STATE_UNLOAD;
     979                 :          0 :                 break;
     980                 :            :         default:
     981                 :            :                 return;
     982                 :            :         }
     983                 :            : 
     984                 :          0 :         event |= APE_EVENT_STATUS_DRIVER_EVNT | APE_EVENT_STATUS_STATE_CHNGE;
     985                 :            : 
     986                 :          0 :         tg3_ape_send_event(tp, event);
     987                 :            : }
     988                 :            : 
     989                 :          0 : static void tg3_send_ape_heartbeat(struct tg3 *tp,
     990                 :            :                                    unsigned long interval)
     991                 :            : {
     992                 :            :         /* Check if hb interval has exceeded */
     993         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_APE) ||
     994         [ #  # ]:          0 :             time_before(jiffies, tp->ape_hb_jiffies + interval))
     995                 :            :                 return;
     996                 :            : 
     997                 :          0 :         tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_COUNT, tp->ape_hb++);
     998                 :          0 :         tp->ape_hb_jiffies = jiffies;
     999                 :            : }
    1000                 :            : 
    1001                 :          0 : static void tg3_disable_ints(struct tg3 *tp)
    1002                 :            : {
    1003                 :          0 :         int i;
    1004                 :            : 
    1005                 :          0 :         tw32(TG3PCI_MISC_HOST_CTRL,
    1006                 :            :              (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT));
    1007         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++)
    1008                 :          0 :                 tw32_mailbox_f(tp->napi[i].int_mbox, 0x00000001);
    1009                 :          0 : }
    1010                 :            : 
    1011                 :          0 : static void tg3_enable_ints(struct tg3 *tp)
    1012                 :            : {
    1013                 :          0 :         int i;
    1014                 :            : 
    1015                 :          0 :         tp->irq_sync = 0;
    1016                 :          0 :         wmb();
    1017                 :            : 
    1018                 :          0 :         tw32(TG3PCI_MISC_HOST_CTRL,
    1019                 :            :              (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
    1020                 :            : 
    1021                 :          0 :         tp->coal_now = tp->coalesce_mode | HOSTCC_MODE_ENABLE;
    1022         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    1023                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    1024                 :            : 
    1025                 :          0 :                 tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24);
    1026         [ #  # ]:          0 :                 if (tg3_flag(tp, 1SHOT_MSI))
    1027                 :          0 :                         tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24);
    1028                 :            : 
    1029                 :          0 :                 tp->coal_now |= tnapi->coal_now;
    1030                 :            :         }
    1031                 :            : 
    1032                 :            :         /* Force an initial interrupt */
    1033         [ #  # ]:          0 :         if (!tg3_flag(tp, TAGGED_STATUS) &&
    1034         [ #  # ]:          0 :             (tp->napi[0].hw_status->status & SD_STATUS_UPDATED))
    1035                 :          0 :                 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
    1036                 :            :         else
    1037                 :          0 :                 tw32(HOSTCC_MODE, tp->coal_now);
    1038                 :            : 
    1039                 :          0 :         tp->coal_now &= ~(tp->napi[0].coal_now | tp->napi[1].coal_now);
    1040                 :          0 : }
    1041                 :            : 
    1042                 :          0 : static inline unsigned int tg3_has_work(struct tg3_napi *tnapi)
    1043                 :            : {
    1044                 :          0 :         struct tg3 *tp = tnapi->tp;
    1045                 :          0 :         struct tg3_hw_status *sblk = tnapi->hw_status;
    1046                 :          0 :         unsigned int work_exists = 0;
    1047                 :            : 
    1048                 :            :         /* check for phy events */
    1049   [ #  #  #  # ]:          0 :         if (!(tg3_flag(tp, USE_LINKCHG_REG) || tg3_flag(tp, POLL_SERDES))) {
    1050         [ #  # ]:          0 :                 if (sblk->status & SD_STATUS_LINK_CHG)
    1051                 :          0 :                         work_exists = 1;
    1052                 :            :         }
    1053                 :            : 
    1054                 :            :         /* check for TX work to do */
    1055         [ #  # ]:          0 :         if (sblk->idx[0].tx_consumer != tnapi->tx_cons)
    1056                 :          0 :                 work_exists = 1;
    1057                 :            : 
    1058                 :            :         /* check for RX work to do */
    1059         [ #  # ]:          0 :         if (tnapi->rx_rcb_prod_idx &&
    1060         [ #  # ]:          0 :             *(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr)
    1061                 :          0 :                 work_exists = 1;
    1062                 :            : 
    1063                 :          0 :         return work_exists;
    1064                 :            : }
    1065                 :            : 
    1066                 :            : /* tg3_int_reenable
    1067                 :            :  *  similar to tg3_enable_ints, but it accurately determines whether there
    1068                 :            :  *  is new work pending and can return without flushing the PIO write
    1069                 :            :  *  which reenables interrupts
    1070                 :            :  */
    1071                 :          0 : static void tg3_int_reenable(struct tg3_napi *tnapi)
    1072                 :            : {
    1073                 :          0 :         struct tg3 *tp = tnapi->tp;
    1074                 :            : 
    1075                 :          0 :         tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24);
    1076                 :            : 
    1077                 :            :         /* When doing tagged status, this work check is unnecessary.
    1078                 :            :          * The last_tag we write above tells the chip which piece of
    1079                 :            :          * work we've completed.
    1080                 :            :          */
    1081   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, TAGGED_STATUS) && tg3_has_work(tnapi))
    1082                 :          0 :                 tw32(HOSTCC_MODE, tp->coalesce_mode |
    1083                 :            :                      HOSTCC_MODE_ENABLE | tnapi->coal_now);
    1084                 :          0 : }
    1085                 :            : 
    1086                 :          0 : static void tg3_switch_clocks(struct tg3 *tp)
    1087                 :            : {
    1088                 :          0 :         u32 clock_ctrl;
    1089                 :          0 :         u32 orig_clock_ctrl;
    1090                 :            : 
    1091   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, CPMU_PRESENT) || tg3_flag(tp, 5780_CLASS))
    1092                 :          0 :                 return;
    1093                 :            : 
    1094                 :          0 :         clock_ctrl = tr32(TG3PCI_CLOCK_CTRL);
    1095                 :            : 
    1096                 :          0 :         orig_clock_ctrl = clock_ctrl;
    1097                 :          0 :         clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN |
    1098                 :            :                        CLOCK_CTRL_CLKRUN_OENABLE |
    1099                 :            :                        0x1f);
    1100                 :          0 :         tp->pci_clock_ctrl = clock_ctrl;
    1101                 :            : 
    1102         [ #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS)) {
    1103         [ #  # ]:          0 :                 if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) {
    1104                 :          0 :                         tw32_wait_f(TG3PCI_CLOCK_CTRL,
    1105                 :            :                                     clock_ctrl | CLOCK_CTRL_625_CORE, 40);
    1106                 :            :                 }
    1107         [ #  # ]:          0 :         } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) {
    1108                 :          0 :                 tw32_wait_f(TG3PCI_CLOCK_CTRL,
    1109                 :            :                             clock_ctrl |
    1110                 :            :                             (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK),
    1111                 :            :                             40);
    1112                 :          0 :                 tw32_wait_f(TG3PCI_CLOCK_CTRL,
    1113                 :            :                             clock_ctrl | (CLOCK_CTRL_ALTCLK),
    1114                 :            :                             40);
    1115                 :            :         }
    1116                 :          0 :         tw32_wait_f(TG3PCI_CLOCK_CTRL, clock_ctrl, 40);
    1117                 :            : }
    1118                 :            : 
    1119                 :            : #define PHY_BUSY_LOOPS  5000
    1120                 :            : 
    1121                 :          0 : static int __tg3_readphy(struct tg3 *tp, unsigned int phy_addr, int reg,
    1122                 :            :                          u32 *val)
    1123                 :            : {
    1124                 :          0 :         u32 frame_val;
    1125                 :          0 :         unsigned int loops;
    1126                 :          0 :         int ret;
    1127                 :            : 
    1128         [ #  # ]:          0 :         if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
    1129                 :          0 :                 tw32_f(MAC_MI_MODE,
    1130                 :            :                      (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
    1131                 :          0 :                 udelay(80);
    1132                 :            :         }
    1133                 :            : 
    1134                 :          0 :         tg3_ape_lock(tp, tp->phy_ape_lock);
    1135                 :            : 
    1136                 :          0 :         *val = 0x0;
    1137                 :            : 
    1138                 :          0 :         frame_val  = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) &
    1139                 :            :                       MI_COM_PHY_ADDR_MASK);
    1140                 :          0 :         frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
    1141                 :            :                       MI_COM_REG_ADDR_MASK);
    1142                 :          0 :         frame_val |= (MI_COM_CMD_READ | MI_COM_START);
    1143                 :            : 
    1144                 :          0 :         tw32_f(MAC_MI_COM, frame_val);
    1145                 :            : 
    1146                 :          0 :         loops = PHY_BUSY_LOOPS;
    1147         [ #  # ]:          0 :         while (loops != 0) {
    1148                 :          0 :                 udelay(10);
    1149                 :          0 :                 frame_val = tr32(MAC_MI_COM);
    1150                 :            : 
    1151         [ #  # ]:          0 :                 if ((frame_val & MI_COM_BUSY) == 0) {
    1152                 :          0 :                         udelay(5);
    1153                 :          0 :                         frame_val = tr32(MAC_MI_COM);
    1154                 :          0 :                         break;
    1155                 :            :                 }
    1156                 :          0 :                 loops -= 1;
    1157                 :            :         }
    1158                 :            : 
    1159                 :          0 :         ret = -EBUSY;
    1160         [ #  # ]:          0 :         if (loops != 0) {
    1161                 :          0 :                 *val = frame_val & MI_COM_DATA_MASK;
    1162                 :          0 :                 ret = 0;
    1163                 :            :         }
    1164                 :            : 
    1165         [ #  # ]:          0 :         if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
    1166                 :          0 :                 tw32_f(MAC_MI_MODE, tp->mi_mode);
    1167                 :          0 :                 udelay(80);
    1168                 :            :         }
    1169                 :            : 
    1170                 :          0 :         tg3_ape_unlock(tp, tp->phy_ape_lock);
    1171                 :            : 
    1172                 :          0 :         return ret;
    1173                 :            : }
    1174                 :            : 
    1175                 :          0 : static int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
    1176                 :            : {
    1177                 :          0 :         return __tg3_readphy(tp, tp->phy_addr, reg, val);
    1178                 :            : }
    1179                 :            : 
    1180                 :          0 : static int __tg3_writephy(struct tg3 *tp, unsigned int phy_addr, int reg,
    1181                 :            :                           u32 val)
    1182                 :            : {
    1183                 :          0 :         u32 frame_val;
    1184                 :          0 :         unsigned int loops;
    1185                 :          0 :         int ret;
    1186                 :            : 
    1187         [ #  # ]:          0 :         if ((tp->phy_flags & TG3_PHYFLG_IS_FET) &&
    1188         [ #  # ]:          0 :             (reg == MII_CTRL1000 || reg == MII_TG3_AUX_CTRL))
    1189                 :            :                 return 0;
    1190                 :            : 
    1191         [ #  # ]:          0 :         if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
    1192                 :          0 :                 tw32_f(MAC_MI_MODE,
    1193                 :            :                      (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
    1194                 :          0 :                 udelay(80);
    1195                 :            :         }
    1196                 :            : 
    1197                 :          0 :         tg3_ape_lock(tp, tp->phy_ape_lock);
    1198                 :            : 
    1199                 :          0 :         frame_val  = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) &
    1200                 :            :                       MI_COM_PHY_ADDR_MASK);
    1201                 :          0 :         frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
    1202                 :            :                       MI_COM_REG_ADDR_MASK);
    1203                 :          0 :         frame_val |= (val & MI_COM_DATA_MASK);
    1204                 :          0 :         frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
    1205                 :            : 
    1206                 :          0 :         tw32_f(MAC_MI_COM, frame_val);
    1207                 :            : 
    1208                 :          0 :         loops = PHY_BUSY_LOOPS;
    1209         [ #  # ]:          0 :         while (loops != 0) {
    1210                 :          0 :                 udelay(10);
    1211                 :          0 :                 frame_val = tr32(MAC_MI_COM);
    1212         [ #  # ]:          0 :                 if ((frame_val & MI_COM_BUSY) == 0) {
    1213                 :          0 :                         udelay(5);
    1214                 :          0 :                         frame_val = tr32(MAC_MI_COM);
    1215                 :          0 :                         break;
    1216                 :            :                 }
    1217                 :          0 :                 loops -= 1;
    1218                 :            :         }
    1219                 :            : 
    1220                 :          0 :         ret = -EBUSY;
    1221         [ #  # ]:          0 :         if (loops != 0)
    1222                 :          0 :                 ret = 0;
    1223                 :            : 
    1224         [ #  # ]:          0 :         if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
    1225                 :          0 :                 tw32_f(MAC_MI_MODE, tp->mi_mode);
    1226                 :          0 :                 udelay(80);
    1227                 :            :         }
    1228                 :            : 
    1229                 :          0 :         tg3_ape_unlock(tp, tp->phy_ape_lock);
    1230                 :            : 
    1231                 :          0 :         return ret;
    1232                 :            : }
    1233                 :            : 
    1234                 :          0 : static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
    1235                 :            : {
    1236                 :          0 :         return __tg3_writephy(tp, tp->phy_addr, reg, val);
    1237                 :            : }
    1238                 :            : 
    1239                 :          0 : static int tg3_phy_cl45_write(struct tg3 *tp, u32 devad, u32 addr, u32 val)
    1240                 :            : {
    1241                 :          0 :         int err;
    1242                 :            : 
    1243                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_CTRL, devad);
    1244         [ #  # ]:          0 :         if (err)
    1245                 :          0 :                 goto done;
    1246                 :            : 
    1247                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_ADDRESS, addr);
    1248         [ #  # ]:          0 :         if (err)
    1249                 :          0 :                 goto done;
    1250                 :            : 
    1251                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_CTRL,
    1252                 :            :                            MII_TG3_MMD_CTRL_DATA_NOINC | devad);
    1253         [ #  # ]:          0 :         if (err)
    1254                 :          0 :                 goto done;
    1255                 :            : 
    1256                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_ADDRESS, val);
    1257                 :            : 
    1258                 :          0 : done:
    1259                 :          0 :         return err;
    1260                 :            : }
    1261                 :            : 
    1262                 :          0 : static int tg3_phy_cl45_read(struct tg3 *tp, u32 devad, u32 addr, u32 *val)
    1263                 :            : {
    1264                 :          0 :         int err;
    1265                 :            : 
    1266                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_CTRL, devad);
    1267         [ #  # ]:          0 :         if (err)
    1268                 :          0 :                 goto done;
    1269                 :            : 
    1270                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_ADDRESS, addr);
    1271         [ #  # ]:          0 :         if (err)
    1272                 :          0 :                 goto done;
    1273                 :            : 
    1274                 :          0 :         err = tg3_writephy(tp, MII_TG3_MMD_CTRL,
    1275                 :            :                            MII_TG3_MMD_CTRL_DATA_NOINC | devad);
    1276         [ #  # ]:          0 :         if (err)
    1277                 :          0 :                 goto done;
    1278                 :            : 
    1279                 :          0 :         err = tg3_readphy(tp, MII_TG3_MMD_ADDRESS, val);
    1280                 :            : 
    1281                 :          0 : done:
    1282                 :          0 :         return err;
    1283                 :            : }
    1284                 :            : 
    1285                 :          0 : static int tg3_phydsp_read(struct tg3 *tp, u32 reg, u32 *val)
    1286                 :            : {
    1287                 :          0 :         int err;
    1288                 :            : 
    1289                 :          0 :         err = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
    1290         [ #  # ]:          0 :         if (!err)
    1291                 :          0 :                 err = tg3_readphy(tp, MII_TG3_DSP_RW_PORT, val);
    1292                 :            : 
    1293                 :          0 :         return err;
    1294                 :            : }
    1295                 :            : 
    1296                 :          0 : static int tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val)
    1297                 :            : {
    1298                 :          0 :         int err;
    1299                 :            : 
    1300                 :          0 :         err = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
    1301         [ #  # ]:          0 :         if (!err)
    1302                 :          0 :                 err = tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
    1303                 :            : 
    1304                 :          0 :         return err;
    1305                 :            : }
    1306                 :            : 
    1307                 :          0 : static int tg3_phy_auxctl_read(struct tg3 *tp, int reg, u32 *val)
    1308                 :            : {
    1309                 :          0 :         int err;
    1310                 :            : 
    1311                 :          0 :         err = tg3_writephy(tp, MII_TG3_AUX_CTRL,
    1312                 :          0 :                            (reg << MII_TG3_AUXCTL_MISC_RDSEL_SHIFT) |
    1313                 :            :                            MII_TG3_AUXCTL_SHDWSEL_MISC);
    1314         [ #  # ]:          0 :         if (!err)
    1315                 :          0 :                 err = tg3_readphy(tp, MII_TG3_AUX_CTRL, val);
    1316                 :            : 
    1317                 :          0 :         return err;
    1318                 :            : }
    1319                 :            : 
    1320                 :          0 : static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set)
    1321                 :            : {
    1322                 :          0 :         if (reg == MII_TG3_AUXCTL_SHDWSEL_MISC)
    1323                 :          0 :                 set |= MII_TG3_AUXCTL_MISC_WREN;
    1324                 :            : 
    1325                 :          0 :         return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg);
    1326                 :            : }
    1327                 :            : 
    1328                 :          0 : static int tg3_phy_toggle_auxctl_smdsp(struct tg3 *tp, bool enable)
    1329                 :            : {
    1330                 :          0 :         u32 val;
    1331                 :          0 :         int err;
    1332                 :            : 
    1333                 :          0 :         err = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val);
    1334                 :            : 
    1335         [ #  # ]:          0 :         if (err)
    1336                 :            :                 return err;
    1337                 :            : 
    1338         [ #  # ]:          0 :         if (enable)
    1339                 :          0 :                 val |= MII_TG3_AUXCTL_ACTL_SMDSP_ENA;
    1340                 :            :         else
    1341                 :          0 :                 val &= ~MII_TG3_AUXCTL_ACTL_SMDSP_ENA;
    1342                 :            : 
    1343                 :          0 :         err = tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL,
    1344                 :            :                                    val | MII_TG3_AUXCTL_ACTL_TX_6DB);
    1345                 :            : 
    1346                 :          0 :         return err;
    1347                 :            : }
    1348                 :            : 
    1349                 :          0 : static int tg3_phy_shdw_write(struct tg3 *tp, int reg, u32 val)
    1350                 :            : {
    1351                 :          0 :         return tg3_writephy(tp, MII_TG3_MISC_SHDW,
    1352                 :            :                             reg | val | MII_TG3_MISC_SHDW_WREN);
    1353                 :            : }
    1354                 :            : 
    1355                 :          0 : static int tg3_bmcr_reset(struct tg3 *tp)
    1356                 :            : {
    1357                 :          0 :         u32 phy_control;
    1358                 :          0 :         int limit, err;
    1359                 :            : 
    1360                 :            :         /* OK, reset it, and poll the BMCR_RESET bit until it
    1361                 :            :          * clears or we time out.
    1362                 :            :          */
    1363                 :          0 :         phy_control = BMCR_RESET;
    1364                 :          0 :         err = tg3_writephy(tp, MII_BMCR, phy_control);
    1365         [ #  # ]:          0 :         if (err != 0)
    1366                 :            :                 return -EBUSY;
    1367                 :            : 
    1368                 :            :         limit = 5000;
    1369         [ #  # ]:          0 :         while (limit--) {
    1370                 :          0 :                 err = tg3_readphy(tp, MII_BMCR, &phy_control);
    1371         [ #  # ]:          0 :                 if (err != 0)
    1372                 :            :                         return -EBUSY;
    1373                 :            : 
    1374         [ #  # ]:          0 :                 if ((phy_control & BMCR_RESET) == 0) {
    1375                 :          0 :                         udelay(40);
    1376                 :            :                         break;
    1377                 :            :                 }
    1378                 :          0 :                 udelay(10);
    1379                 :            :         }
    1380         [ #  # ]:          0 :         if (limit < 0)
    1381                 :          0 :                 return -EBUSY;
    1382                 :            : 
    1383                 :            :         return 0;
    1384                 :            : }
    1385                 :            : 
    1386                 :          0 : static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg)
    1387                 :            : {
    1388                 :          0 :         struct tg3 *tp = bp->priv;
    1389                 :          0 :         u32 val;
    1390                 :            : 
    1391                 :          0 :         spin_lock_bh(&tp->lock);
    1392                 :            : 
    1393         [ #  # ]:          0 :         if (__tg3_readphy(tp, mii_id, reg, &val))
    1394                 :          0 :                 val = -EIO;
    1395                 :            : 
    1396                 :          0 :         spin_unlock_bh(&tp->lock);
    1397                 :            : 
    1398                 :          0 :         return val;
    1399                 :            : }
    1400                 :            : 
    1401                 :          0 : static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val)
    1402                 :            : {
    1403                 :          0 :         struct tg3 *tp = bp->priv;
    1404                 :          0 :         u32 ret = 0;
    1405                 :            : 
    1406                 :          0 :         spin_lock_bh(&tp->lock);
    1407                 :            : 
    1408         [ #  # ]:          0 :         if (__tg3_writephy(tp, mii_id, reg, val))
    1409                 :          0 :                 ret = -EIO;
    1410                 :            : 
    1411                 :          0 :         spin_unlock_bh(&tp->lock);
    1412                 :            : 
    1413                 :          0 :         return ret;
    1414                 :            : }
    1415                 :            : 
    1416                 :          0 : static void tg3_mdio_config_5785(struct tg3 *tp)
    1417                 :            : {
    1418                 :          0 :         u32 val;
    1419                 :          0 :         struct phy_device *phydev;
    1420                 :            : 
    1421                 :          0 :         phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
    1422   [ #  #  #  #  :          0 :         switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) {
                      # ]
    1423                 :            :         case PHY_ID_BCM50610:
    1424                 :            :         case PHY_ID_BCM50610M:
    1425                 :            :                 val = MAC_PHYCFG2_50610_LED_MODES;
    1426                 :            :                 break;
    1427                 :          0 :         case PHY_ID_BCMAC131:
    1428                 :          0 :                 val = MAC_PHYCFG2_AC131_LED_MODES;
    1429                 :          0 :                 break;
    1430                 :          0 :         case PHY_ID_RTL8211C:
    1431                 :          0 :                 val = MAC_PHYCFG2_RTL8211C_LED_MODES;
    1432                 :          0 :                 break;
    1433                 :          0 :         case PHY_ID_RTL8201E:
    1434                 :          0 :                 val = MAC_PHYCFG2_RTL8201E_LED_MODES;
    1435                 :          0 :                 break;
    1436                 :            :         default:
    1437                 :            :                 return;
    1438                 :            :         }
    1439                 :            : 
    1440         [ #  # ]:          0 :         if (phydev->interface != PHY_INTERFACE_MODE_RGMII) {
    1441                 :          0 :                 tw32(MAC_PHYCFG2, val);
    1442                 :            : 
    1443                 :          0 :                 val = tr32(MAC_PHYCFG1);
    1444                 :          0 :                 val &= ~(MAC_PHYCFG1_RGMII_INT |
    1445                 :            :                          MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK);
    1446                 :          0 :                 val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT;
    1447                 :          0 :                 tw32(MAC_PHYCFG1, val);
    1448                 :            : 
    1449                 :          0 :                 return;
    1450                 :            :         }
    1451                 :            : 
    1452         [ #  # ]:          0 :         if (!tg3_flag(tp, RGMII_INBAND_DISABLE))
    1453                 :          0 :                 val |= MAC_PHYCFG2_EMODE_MASK_MASK |
    1454                 :            :                        MAC_PHYCFG2_FMODE_MASK_MASK |
    1455                 :            :                        MAC_PHYCFG2_GMODE_MASK_MASK |
    1456                 :            :                        MAC_PHYCFG2_ACT_MASK_MASK   |
    1457                 :            :                        MAC_PHYCFG2_QUAL_MASK_MASK |
    1458                 :            :                        MAC_PHYCFG2_INBAND_ENABLE;
    1459                 :            : 
    1460                 :          0 :         tw32(MAC_PHYCFG2, val);
    1461                 :            : 
    1462                 :          0 :         val = tr32(MAC_PHYCFG1);
    1463                 :          0 :         val &= ~(MAC_PHYCFG1_RXCLK_TO_MASK | MAC_PHYCFG1_TXCLK_TO_MASK |
    1464                 :            :                  MAC_PHYCFG1_RGMII_EXT_RX_DEC | MAC_PHYCFG1_RGMII_SND_STAT_EN);
    1465         [ #  # ]:          0 :         if (!tg3_flag(tp, RGMII_INBAND_DISABLE)) {
    1466         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_EXT_IBND_RX_EN))
    1467                 :          0 :                         val |= MAC_PHYCFG1_RGMII_EXT_RX_DEC;
    1468         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN))
    1469                 :          0 :                         val |= MAC_PHYCFG1_RGMII_SND_STAT_EN;
    1470                 :            :         }
    1471                 :          0 :         val |= MAC_PHYCFG1_RXCLK_TIMEOUT | MAC_PHYCFG1_TXCLK_TIMEOUT |
    1472                 :            :                MAC_PHYCFG1_RGMII_INT | MAC_PHYCFG1_TXC_DRV;
    1473                 :          0 :         tw32(MAC_PHYCFG1, val);
    1474                 :            : 
    1475                 :          0 :         val = tr32(MAC_EXT_RGMII_MODE);
    1476                 :          0 :         val &= ~(MAC_RGMII_MODE_RX_INT_B |
    1477                 :            :                  MAC_RGMII_MODE_RX_QUALITY |
    1478                 :            :                  MAC_RGMII_MODE_RX_ACTIVITY |
    1479                 :            :                  MAC_RGMII_MODE_RX_ENG_DET |
    1480                 :            :                  MAC_RGMII_MODE_TX_ENABLE |
    1481                 :            :                  MAC_RGMII_MODE_TX_LOWPWR |
    1482                 :            :                  MAC_RGMII_MODE_TX_RESET);
    1483         [ #  # ]:          0 :         if (!tg3_flag(tp, RGMII_INBAND_DISABLE)) {
    1484         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_EXT_IBND_RX_EN))
    1485                 :          0 :                         val |= MAC_RGMII_MODE_RX_INT_B |
    1486                 :            :                                MAC_RGMII_MODE_RX_QUALITY |
    1487                 :            :                                MAC_RGMII_MODE_RX_ACTIVITY |
    1488                 :            :                                MAC_RGMII_MODE_RX_ENG_DET;
    1489         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN))
    1490                 :          0 :                         val |= MAC_RGMII_MODE_TX_ENABLE |
    1491                 :            :                                MAC_RGMII_MODE_TX_LOWPWR |
    1492                 :            :                                MAC_RGMII_MODE_TX_RESET;
    1493                 :            :         }
    1494                 :          0 :         tw32(MAC_EXT_RGMII_MODE, val);
    1495                 :            : }
    1496                 :            : 
    1497                 :          0 : static void tg3_mdio_start(struct tg3 *tp)
    1498                 :            : {
    1499                 :          0 :         tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL;
    1500                 :          0 :         tw32_f(MAC_MI_MODE, tp->mi_mode);
    1501                 :          0 :         udelay(80);
    1502                 :            : 
    1503         [ #  # ]:          0 :         if (tg3_flag(tp, MDIOBUS_INITED) &&
    1504         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5785)
    1505                 :          0 :                 tg3_mdio_config_5785(tp);
    1506                 :          0 : }
    1507                 :            : 
    1508                 :          0 : static int tg3_mdio_init(struct tg3 *tp)
    1509                 :            : {
    1510                 :          0 :         int i;
    1511                 :          0 :         u32 reg;
    1512                 :          0 :         struct phy_device *phydev;
    1513                 :            : 
    1514         [ #  # ]:          0 :         if (tg3_flag(tp, 5717_PLUS)) {
    1515                 :          0 :                 u32 is_serdes;
    1516                 :            : 
    1517                 :          0 :                 tp->phy_addr = tp->pci_fn + 1;
    1518                 :            : 
    1519         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) != CHIPREV_ID_5717_A0)
    1520                 :          0 :                         is_serdes = tr32(SG_DIG_STATUS) & SG_DIG_IS_SERDES;
    1521                 :            :                 else
    1522                 :          0 :                         is_serdes = tr32(TG3_CPMU_PHY_STRAP) &
    1523                 :            :                                     TG3_CPMU_PHY_STRAP_IS_SERDES;
    1524         [ #  # ]:          0 :                 if (is_serdes)
    1525                 :          0 :                         tp->phy_addr += 7;
    1526   [ #  #  #  # ]:          0 :         } else if (tg3_flag(tp, IS_SSB_CORE) && tg3_flag(tp, ROBOSWITCH)) {
    1527                 :            :                 int addr;
    1528                 :            : 
    1529                 :            :                 addr = ssb_gige_get_phyaddr(tp->pdev);
    1530                 :            :                 if (addr < 0)
    1531                 :            :                         return addr;
    1532                 :            :                 tp->phy_addr = addr;
    1533                 :            :         } else
    1534                 :          0 :                 tp->phy_addr = TG3_PHY_MII_ADDR;
    1535                 :            : 
    1536                 :          0 :         tg3_mdio_start(tp);
    1537                 :            : 
    1538   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, USE_PHYLIB) || tg3_flag(tp, MDIOBUS_INITED))
    1539                 :          0 :                 return 0;
    1540                 :            : 
    1541                 :          0 :         tp->mdio_bus = mdiobus_alloc();
    1542         [ #  # ]:          0 :         if (tp->mdio_bus == NULL)
    1543                 :            :                 return -ENOMEM;
    1544                 :            : 
    1545                 :          0 :         tp->mdio_bus->name     = "tg3 mdio bus";
    1546                 :          0 :         snprintf(tp->mdio_bus->id, MII_BUS_ID_SIZE, "%x",
    1547                 :          0 :                  (tp->pdev->bus->number << 8) | tp->pdev->devfn);
    1548                 :          0 :         tp->mdio_bus->priv     = tp;
    1549                 :          0 :         tp->mdio_bus->parent   = &tp->pdev->dev;
    1550                 :          0 :         tp->mdio_bus->read     = &tg3_mdio_read;
    1551                 :          0 :         tp->mdio_bus->write    = &tg3_mdio_write;
    1552                 :          0 :         tp->mdio_bus->phy_mask = ~(1 << tp->phy_addr);
    1553                 :            : 
    1554                 :            :         /* The bus registration will look for all the PHYs on the mdio bus.
    1555                 :            :          * Unfortunately, it does not ensure the PHY is powered up before
    1556                 :            :          * accessing the PHY ID registers.  A chip reset is the
    1557                 :            :          * quickest way to bring the device back to an operational state..
    1558                 :            :          */
    1559   [ #  #  #  # ]:          0 :         if (tg3_readphy(tp, MII_BMCR, &reg) || (reg & BMCR_PDOWN))
    1560                 :          0 :                 tg3_bmcr_reset(tp);
    1561                 :            : 
    1562                 :          0 :         i = mdiobus_register(tp->mdio_bus);
    1563         [ #  # ]:          0 :         if (i) {
    1564                 :          0 :                 dev_warn(&tp->pdev->dev, "mdiobus_reg failed (0x%x)\n", i);
    1565                 :          0 :                 mdiobus_free(tp->mdio_bus);
    1566                 :          0 :                 return i;
    1567                 :            :         }
    1568                 :            : 
    1569                 :          0 :         phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
    1570                 :            : 
    1571   [ #  #  #  # ]:          0 :         if (!phydev || !phydev->drv) {
    1572                 :          0 :                 dev_warn(&tp->pdev->dev, "No PHY devices\n");
    1573                 :          0 :                 mdiobus_unregister(tp->mdio_bus);
    1574                 :          0 :                 mdiobus_free(tp->mdio_bus);
    1575                 :          0 :                 return -ENODEV;
    1576                 :            :         }
    1577                 :            : 
    1578   [ #  #  #  #  :          0 :         switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) {
                      # ]
    1579                 :          0 :         case PHY_ID_BCM57780:
    1580                 :          0 :                 phydev->interface = PHY_INTERFACE_MODE_GMII;
    1581                 :          0 :                 phydev->dev_flags |= PHY_BRCM_AUTO_PWRDWN_ENABLE;
    1582                 :          0 :                 break;
    1583                 :          0 :         case PHY_ID_BCM50610:
    1584                 :            :         case PHY_ID_BCM50610M:
    1585                 :          0 :                 phydev->dev_flags |= PHY_BRCM_CLEAR_RGMII_MODE |
    1586                 :            :                                      PHY_BRCM_RX_REFCLK_UNUSED |
    1587                 :            :                                      PHY_BRCM_DIS_TXCRXC_NOENRGY |
    1588                 :            :                                      PHY_BRCM_AUTO_PWRDWN_ENABLE;
    1589         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_INBAND_DISABLE))
    1590                 :          0 :                         phydev->dev_flags |= PHY_BRCM_STD_IBND_DISABLE;
    1591         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_EXT_IBND_RX_EN))
    1592                 :          0 :                         phydev->dev_flags |= PHY_BRCM_EXT_IBND_RX_ENABLE;
    1593         [ #  # ]:          0 :                 if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN))
    1594                 :          0 :                         phydev->dev_flags |= PHY_BRCM_EXT_IBND_TX_ENABLE;
    1595                 :            :                 /* fall through */
    1596                 :            :         case PHY_ID_RTL8211C:
    1597                 :          0 :                 phydev->interface = PHY_INTERFACE_MODE_RGMII;
    1598                 :          0 :                 break;
    1599                 :          0 :         case PHY_ID_RTL8201E:
    1600                 :            :         case PHY_ID_BCMAC131:
    1601                 :          0 :                 phydev->interface = PHY_INTERFACE_MODE_MII;
    1602                 :          0 :                 phydev->dev_flags |= PHY_BRCM_AUTO_PWRDWN_ENABLE;
    1603                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_IS_FET;
    1604                 :          0 :                 break;
    1605                 :            :         }
    1606                 :            : 
    1607                 :          0 :         tg3_flag_set(tp, MDIOBUS_INITED);
    1608                 :            : 
    1609         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5785)
    1610                 :          0 :                 tg3_mdio_config_5785(tp);
    1611                 :            : 
    1612                 :            :         return 0;
    1613                 :            : }
    1614                 :            : 
    1615                 :          0 : static void tg3_mdio_fini(struct tg3 *tp)
    1616                 :            : {
    1617         [ #  # ]:          0 :         if (tg3_flag(tp, MDIOBUS_INITED)) {
    1618                 :          0 :                 tg3_flag_clear(tp, MDIOBUS_INITED);
    1619                 :          0 :                 mdiobus_unregister(tp->mdio_bus);
    1620                 :          0 :                 mdiobus_free(tp->mdio_bus);
    1621                 :            :         }
    1622                 :          0 : }
    1623                 :            : 
    1624                 :            : /* tp->lock is held. */
    1625                 :          0 : static inline void tg3_generate_fw_event(struct tg3 *tp)
    1626                 :            : {
    1627                 :          0 :         u32 val;
    1628                 :            : 
    1629                 :          0 :         val = tr32(GRC_RX_CPU_EVENT);
    1630                 :          0 :         val |= GRC_RX_CPU_DRIVER_EVENT;
    1631                 :          0 :         tw32_f(GRC_RX_CPU_EVENT, val);
    1632                 :            : 
    1633                 :          0 :         tp->last_event_jiffies = jiffies;
    1634                 :          0 : }
    1635                 :            : 
    1636                 :            : #define TG3_FW_EVENT_TIMEOUT_USEC 2500
    1637                 :            : 
    1638                 :            : /* tp->lock is held. */
    1639                 :          0 : static void tg3_wait_for_event_ack(struct tg3 *tp)
    1640                 :            : {
    1641                 :          0 :         int i;
    1642                 :          0 :         unsigned int delay_cnt;
    1643                 :          0 :         long time_remain;
    1644                 :            : 
    1645                 :            :         /* If enough time has passed, no wait is necessary. */
    1646                 :          0 :         time_remain = (long)(tp->last_event_jiffies + 1 +
    1647                 :          0 :                       usecs_to_jiffies(TG3_FW_EVENT_TIMEOUT_USEC)) -
    1648                 :            :                       (long)jiffies;
    1649         [ #  # ]:          0 :         if (time_remain < 0)
    1650                 :            :                 return;
    1651                 :            : 
    1652                 :            :         /* Check if we can shorten the wait time. */
    1653                 :          0 :         delay_cnt = jiffies_to_usecs(time_remain);
    1654                 :          0 :         if (delay_cnt > TG3_FW_EVENT_TIMEOUT_USEC)
    1655                 :            :                 delay_cnt = TG3_FW_EVENT_TIMEOUT_USEC;
    1656                 :          0 :         delay_cnt = (delay_cnt >> 3) + 1;
    1657                 :            : 
    1658         [ #  # ]:          0 :         for (i = 0; i < delay_cnt; i++) {
    1659         [ #  # ]:          0 :                 if (!(tr32(GRC_RX_CPU_EVENT) & GRC_RX_CPU_DRIVER_EVENT))
    1660                 :            :                         break;
    1661         [ #  # ]:          0 :                 if (pci_channel_offline(tp->pdev))
    1662                 :            :                         break;
    1663                 :            : 
    1664                 :          0 :                 udelay(8);
    1665                 :            :         }
    1666                 :            : }
    1667                 :            : 
    1668                 :            : /* tp->lock is held. */
    1669                 :          0 : static void tg3_phy_gather_ump_data(struct tg3 *tp, u32 *data)
    1670                 :            : {
    1671                 :          0 :         u32 reg, val;
    1672                 :            : 
    1673                 :          0 :         val = 0;
    1674         [ #  # ]:          0 :         if (!tg3_readphy(tp, MII_BMCR, &reg))
    1675                 :          0 :                 val = reg << 16;
    1676         [ #  # ]:          0 :         if (!tg3_readphy(tp, MII_BMSR, &reg))
    1677                 :          0 :                 val |= (reg & 0xffff);
    1678                 :          0 :         *data++ = val;
    1679                 :            : 
    1680                 :          0 :         val = 0;
    1681         [ #  # ]:          0 :         if (!tg3_readphy(tp, MII_ADVERTISE, &reg))
    1682                 :          0 :                 val = reg << 16;
    1683         [ #  # ]:          0 :         if (!tg3_readphy(tp, MII_LPA, &reg))
    1684                 :          0 :                 val |= (reg & 0xffff);
    1685                 :          0 :         *data++ = val;
    1686                 :            : 
    1687                 :          0 :         val = 0;
    1688         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_MII_SERDES)) {
    1689         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_CTRL1000, &reg))
    1690                 :          0 :                         val = reg << 16;
    1691         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_STAT1000, &reg))
    1692                 :          0 :                         val |= (reg & 0xffff);
    1693                 :            :         }
    1694                 :          0 :         *data++ = val;
    1695                 :            : 
    1696         [ #  # ]:          0 :         if (!tg3_readphy(tp, MII_PHYADDR, &reg))
    1697                 :          0 :                 val = reg << 16;
    1698                 :            :         else
    1699                 :            :                 val = 0;
    1700                 :          0 :         *data++ = val;
    1701                 :          0 : }
    1702                 :            : 
    1703                 :            : /* tp->lock is held. */
    1704                 :          0 : static void tg3_ump_link_report(struct tg3 *tp)
    1705                 :            : {
    1706                 :          0 :         u32 data[4];
    1707                 :            : 
    1708   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF))
    1709                 :          0 :                 return;
    1710                 :            : 
    1711                 :          0 :         tg3_phy_gather_ump_data(tp, data);
    1712                 :            : 
    1713                 :          0 :         tg3_wait_for_event_ack(tp);
    1714                 :            : 
    1715                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE);
    1716                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14);
    1717                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x0, data[0]);
    1718                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x4, data[1]);
    1719                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0x8, data[2]);
    1720                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 0xc, data[3]);
    1721                 :            : 
    1722                 :          0 :         tg3_generate_fw_event(tp);
    1723                 :            : }
    1724                 :            : 
    1725                 :            : /* tp->lock is held. */
    1726                 :          0 : static void tg3_stop_fw(struct tg3 *tp)
    1727                 :            : {
    1728   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF) && !tg3_flag(tp, ENABLE_APE)) {
    1729                 :            :                 /* Wait for RX cpu to ACK the previous event. */
    1730                 :          0 :                 tg3_wait_for_event_ack(tp);
    1731                 :            : 
    1732                 :          0 :                 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW);
    1733                 :            : 
    1734                 :          0 :                 tg3_generate_fw_event(tp);
    1735                 :            : 
    1736                 :            :                 /* Wait for RX cpu to ACK this event. */
    1737                 :          0 :                 tg3_wait_for_event_ack(tp);
    1738                 :            :         }
    1739                 :          0 : }
    1740                 :            : 
    1741                 :            : /* tp->lock is held. */
    1742                 :          0 : static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind)
    1743                 :            : {
    1744                 :          0 :         tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
    1745                 :            :                       NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
    1746                 :            : 
    1747         [ #  # ]:          0 :         if (tg3_flag(tp, ASF_NEW_HANDSHAKE)) {
    1748   [ #  #  #  # ]:          0 :                 switch (kind) {
    1749                 :          0 :                 case RESET_KIND_INIT:
    1750                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1751                 :            :                                       DRV_STATE_START);
    1752                 :          0 :                         break;
    1753                 :            : 
    1754                 :          0 :                 case RESET_KIND_SHUTDOWN:
    1755                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1756                 :            :                                       DRV_STATE_UNLOAD);
    1757                 :          0 :                         break;
    1758                 :            : 
    1759                 :          0 :                 case RESET_KIND_SUSPEND:
    1760                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1761                 :            :                                       DRV_STATE_SUSPEND);
    1762                 :          0 :                         break;
    1763                 :            : 
    1764                 :            :                 default:
    1765                 :            :                         break;
    1766                 :            :                 }
    1767                 :          0 :         }
    1768                 :          0 : }
    1769                 :            : 
    1770                 :            : /* tp->lock is held. */
    1771                 :          0 : static void tg3_write_sig_post_reset(struct tg3 *tp, int kind)
    1772                 :            : {
    1773         [ #  # ]:          0 :         if (tg3_flag(tp, ASF_NEW_HANDSHAKE)) {
    1774      [ #  #  # ]:          0 :                 switch (kind) {
    1775                 :          0 :                 case RESET_KIND_INIT:
    1776                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1777                 :            :                                       DRV_STATE_START_DONE);
    1778                 :          0 :                         break;
    1779                 :            : 
    1780                 :          0 :                 case RESET_KIND_SHUTDOWN:
    1781                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1782                 :            :                                       DRV_STATE_UNLOAD_DONE);
    1783                 :          0 :                         break;
    1784                 :            : 
    1785                 :            :                 default:
    1786                 :            :                         break;
    1787                 :            :                 }
    1788                 :          0 :         }
    1789                 :          0 : }
    1790                 :            : 
    1791                 :            : /* tp->lock is held. */
    1792                 :          0 : static void tg3_write_sig_legacy(struct tg3 *tp, int kind)
    1793                 :            : {
    1794         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF)) {
    1795   [ #  #  #  # ]:          0 :                 switch (kind) {
    1796                 :          0 :                 case RESET_KIND_INIT:
    1797                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1798                 :            :                                       DRV_STATE_START);
    1799                 :          0 :                         break;
    1800                 :            : 
    1801                 :          0 :                 case RESET_KIND_SHUTDOWN:
    1802                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1803                 :            :                                       DRV_STATE_UNLOAD);
    1804                 :          0 :                         break;
    1805                 :            : 
    1806                 :          0 :                 case RESET_KIND_SUSPEND:
    1807                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
    1808                 :            :                                       DRV_STATE_SUSPEND);
    1809                 :          0 :                         break;
    1810                 :            : 
    1811                 :            :                 default:
    1812                 :            :                         break;
    1813                 :            :                 }
    1814                 :          0 :         }
    1815                 :          0 : }
    1816                 :            : 
    1817                 :          0 : static int tg3_poll_fw(struct tg3 *tp)
    1818                 :            : {
    1819                 :          0 :         int i;
    1820                 :          0 :         u32 val;
    1821                 :            : 
    1822         [ #  # ]:          0 :         if (tg3_flag(tp, NO_FWARE_REPORTED))
    1823                 :            :                 return 0;
    1824                 :            : 
    1825         [ #  # ]:          0 :         if (tg3_flag(tp, IS_SSB_CORE)) {
    1826                 :            :                 /* We don't use firmware. */
    1827                 :            :                 return 0;
    1828                 :            :         }
    1829                 :            : 
    1830         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    1831                 :            :                 /* Wait up to 20ms for init done. */
    1832         [ #  # ]:          0 :                 for (i = 0; i < 200; i++) {
    1833         [ #  # ]:          0 :                         if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE)
    1834                 :            :                                 return 0;
    1835         [ #  # ]:          0 :                         if (pci_channel_offline(tp->pdev))
    1836                 :            :                                 return -ENODEV;
    1837                 :            : 
    1838                 :          0 :                         udelay(100);
    1839                 :            :                 }
    1840                 :            :                 return -ENODEV;
    1841                 :            :         }
    1842                 :            : 
    1843                 :            :         /* Wait for firmware initialization to complete. */
    1844         [ #  # ]:          0 :         for (i = 0; i < 100000; i++) {
    1845                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
    1846         [ #  # ]:          0 :                 if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
    1847                 :            :                         break;
    1848         [ #  # ]:          0 :                 if (pci_channel_offline(tp->pdev)) {
    1849         [ #  # ]:          0 :                         if (!tg3_flag(tp, NO_FWARE_REPORTED)) {
    1850                 :          0 :                                 tg3_flag_set(tp, NO_FWARE_REPORTED);
    1851                 :          0 :                                 netdev_info(tp->dev, "No firmware running\n");
    1852                 :            :                         }
    1853                 :            : 
    1854                 :            :                         break;
    1855                 :            :                 }
    1856                 :            : 
    1857                 :          0 :                 udelay(10);
    1858                 :            :         }
    1859                 :            : 
    1860                 :            :         /* Chip might not be fitted with firmware.  Some Sun onboard
    1861                 :            :          * parts are configured like that.  So don't signal the timeout
    1862                 :            :          * of the above loop as an error, but do report the lack of
    1863                 :            :          * running firmware once.
    1864                 :            :          */
    1865   [ #  #  #  # ]:          0 :         if (i >= 100000 && !tg3_flag(tp, NO_FWARE_REPORTED)) {
    1866                 :          0 :                 tg3_flag_set(tp, NO_FWARE_REPORTED);
    1867                 :            : 
    1868                 :          0 :                 netdev_info(tp->dev, "No firmware running\n");
    1869                 :            :         }
    1870                 :            : 
    1871         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0) {
    1872                 :            :                 /* The 57765 A0 needs a little more
    1873                 :            :                  * time to do some important work.
    1874                 :            :                  */
    1875         [ #  # ]:          0 :                 mdelay(10);
    1876                 :            :         }
    1877                 :            : 
    1878                 :            :         return 0;
    1879                 :            : }
    1880                 :            : 
    1881                 :          0 : static void tg3_link_report(struct tg3 *tp)
    1882                 :            : {
    1883         [ #  # ]:          0 :         if (!netif_carrier_ok(tp->dev)) {
    1884         [ #  # ]:          0 :                 netif_info(tp, link, tp->dev, "Link is down\n");
    1885                 :          0 :                 tg3_ump_link_report(tp);
    1886         [ #  # ]:          0 :         } else if (netif_msg_link(tp)) {
    1887                 :          0 :                 netdev_info(tp->dev, "Link is up at %d Mbps, %s duplex\n",
    1888         [ #  # ]:          0 :                             (tp->link_config.active_speed == SPEED_1000 ?
    1889                 :            :                              1000 :
    1890                 :            :                              (tp->link_config.active_speed == SPEED_100 ?
    1891         [ #  # ]:          0 :                               100 : 10)),
    1892         [ #  # ]:          0 :                             (tp->link_config.active_duplex == DUPLEX_FULL ?
    1893                 :            :                              "full" : "half"));
    1894                 :            : 
    1895         [ #  # ]:          0 :                 netdev_info(tp->dev, "Flow control is %s for TX and %s for RX\n",
    1896                 :            :                             (tp->link_config.active_flowctrl & FLOW_CTRL_TX) ?
    1897                 :            :                             "on" : "off",
    1898         [ #  # ]:          0 :                             (tp->link_config.active_flowctrl & FLOW_CTRL_RX) ?
    1899                 :            :                             "on" : "off");
    1900                 :            : 
    1901         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_EEE_CAP)
    1902                 :          0 :                         netdev_info(tp->dev, "EEE is %s\n",
    1903         [ #  # ]:          0 :                                     tp->setlpicnt ? "enabled" : "disabled");
    1904                 :            : 
    1905                 :          0 :                 tg3_ump_link_report(tp);
    1906                 :            :         }
    1907                 :            : 
    1908                 :          0 :         tp->link_up = netif_carrier_ok(tp->dev);
    1909                 :          0 : }
    1910                 :            : 
    1911                 :          0 : static u32 tg3_decode_flowctrl_1000T(u32 adv)
    1912                 :            : {
    1913                 :          0 :         u32 flowctrl = 0;
    1914                 :            : 
    1915                 :          0 :         if (adv & ADVERTISE_PAUSE_CAP) {
    1916                 :          0 :                 flowctrl |= FLOW_CTRL_RX;
    1917         [ #  # ]:          0 :                 if (!(adv & ADVERTISE_PAUSE_ASYM))
    1918                 :          0 :                         flowctrl |= FLOW_CTRL_TX;
    1919         [ #  # ]:          0 :         } else if (adv & ADVERTISE_PAUSE_ASYM)
    1920                 :          0 :                 flowctrl |= FLOW_CTRL_TX;
    1921                 :            : 
    1922                 :          0 :         return flowctrl;
    1923                 :            : }
    1924                 :            : 
    1925                 :          0 : static u16 tg3_advert_flowctrl_1000X(u8 flow_ctrl)
    1926                 :            : {
    1927                 :          0 :         u16 miireg;
    1928                 :            : 
    1929                 :          0 :         if ((flow_ctrl & FLOW_CTRL_TX) && (flow_ctrl & FLOW_CTRL_RX))
    1930                 :            :                 miireg = ADVERTISE_1000XPAUSE;
    1931   [ #  #  #  #  :          0 :         else if (flow_ctrl & FLOW_CTRL_TX)
                   #  # ]
    1932                 :            :                 miireg = ADVERTISE_1000XPSE_ASYM;
    1933   [ #  #  #  #  :          0 :         else if (flow_ctrl & FLOW_CTRL_RX)
                   #  # ]
    1934                 :            :                 miireg = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
    1935                 :            :         else
    1936                 :          0 :                 miireg = 0;
    1937                 :            : 
    1938                 :          0 :         return miireg;
    1939                 :            : }
    1940                 :            : 
    1941                 :          0 : static u32 tg3_decode_flowctrl_1000X(u32 adv)
    1942                 :            : {
    1943                 :          0 :         u32 flowctrl = 0;
    1944                 :            : 
    1945                 :          0 :         if (adv & ADVERTISE_1000XPAUSE) {
    1946                 :          0 :                 flowctrl |= FLOW_CTRL_RX;
    1947         [ #  # ]:          0 :                 if (!(adv & ADVERTISE_1000XPSE_ASYM))
    1948                 :          0 :                         flowctrl |= FLOW_CTRL_TX;
    1949         [ #  # ]:          0 :         } else if (adv & ADVERTISE_1000XPSE_ASYM)
    1950                 :          0 :                 flowctrl |= FLOW_CTRL_TX;
    1951                 :            : 
    1952                 :          0 :         return flowctrl;
    1953                 :            : }
    1954                 :            : 
    1955                 :          0 : static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv)
    1956                 :            : {
    1957                 :          0 :         u8 cap = 0;
    1958                 :            : 
    1959                 :          0 :         if (lcladv & rmtadv & ADVERTISE_1000XPAUSE) {
    1960                 :            :                 cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
    1961         [ #  # ]:          0 :         } else if (lcladv & rmtadv & ADVERTISE_1000XPSE_ASYM) {
    1962         [ #  # ]:          0 :                 if (lcladv & ADVERTISE_1000XPAUSE)
    1963                 :          0 :                         cap = FLOW_CTRL_RX;
    1964         [ #  # ]:          0 :                 if (rmtadv & ADVERTISE_1000XPAUSE)
    1965                 :          0 :                         cap = FLOW_CTRL_TX;
    1966                 :            :         }
    1967                 :            : 
    1968                 :            :         return cap;
    1969                 :            : }
    1970                 :            : 
    1971                 :          0 : static void tg3_setup_flow_control(struct tg3 *tp, u32 lcladv, u32 rmtadv)
    1972                 :            : {
    1973                 :          0 :         u8 autoneg;
    1974                 :          0 :         u8 flowctrl = 0;
    1975                 :          0 :         u32 old_rx_mode = tp->rx_mode;
    1976                 :          0 :         u32 old_tx_mode = tp->tx_mode;
    1977                 :            : 
    1978         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB))
    1979                 :          0 :                 autoneg = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)->autoneg;
    1980                 :            :         else
    1981                 :          0 :                 autoneg = tp->link_config.autoneg;
    1982                 :            : 
    1983   [ #  #  #  # ]:          0 :         if (autoneg == AUTONEG_ENABLE && tg3_flag(tp, PAUSE_AUTONEG)) {
    1984         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
    1985         [ #  # ]:          0 :                         flowctrl = tg3_resolve_flowctrl_1000X(lcladv, rmtadv);
    1986                 :            :                 else
    1987         [ #  # ]:          0 :                         flowctrl = mii_resolve_flowctrl_fdx(lcladv, rmtadv);
    1988                 :            :         } else
    1989                 :          0 :                 flowctrl = tp->link_config.flowctrl;
    1990                 :            : 
    1991                 :          0 :         tp->link_config.active_flowctrl = flowctrl;
    1992                 :            : 
    1993         [ #  # ]:          0 :         if (flowctrl & FLOW_CTRL_RX)
    1994                 :          0 :                 tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
    1995                 :            :         else
    1996                 :          0 :                 tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
    1997                 :            : 
    1998         [ #  # ]:          0 :         if (old_rx_mode != tp->rx_mode)
    1999                 :          0 :                 tw32_f(MAC_RX_MODE, tp->rx_mode);
    2000                 :            : 
    2001         [ #  # ]:          0 :         if (flowctrl & FLOW_CTRL_TX)
    2002                 :          0 :                 tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
    2003                 :            :         else
    2004                 :          0 :                 tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
    2005                 :            : 
    2006         [ #  # ]:          0 :         if (old_tx_mode != tp->tx_mode)
    2007                 :          0 :                 tw32_f(MAC_TX_MODE, tp->tx_mode);
    2008                 :          0 : }
    2009                 :            : 
    2010                 :          0 : static void tg3_adjust_link(struct net_device *dev)
    2011                 :            : {
    2012                 :          0 :         u8 oldflowctrl, linkmesg = 0;
    2013                 :          0 :         u32 mac_mode, lcl_adv, rmt_adv;
    2014                 :          0 :         struct tg3 *tp = netdev_priv(dev);
    2015                 :          0 :         struct phy_device *phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
    2016                 :            : 
    2017                 :          0 :         spin_lock_bh(&tp->lock);
    2018                 :            : 
    2019                 :          0 :         mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK |
    2020                 :            :                                     MAC_MODE_HALF_DUPLEX);
    2021                 :            : 
    2022                 :          0 :         oldflowctrl = tp->link_config.active_flowctrl;
    2023                 :            : 
    2024         [ #  # ]:          0 :         if (phydev->link) {
    2025                 :          0 :                 lcl_adv = 0;
    2026                 :          0 :                 rmt_adv = 0;
    2027                 :            : 
    2028         [ #  # ]:          0 :                 if (phydev->speed == SPEED_100 || phydev->speed == SPEED_10)
    2029                 :          0 :                         mac_mode |= MAC_MODE_PORT_MODE_MII;
    2030         [ #  # ]:          0 :                 else if (phydev->speed == SPEED_1000 ||
    2031         [ #  # ]:          0 :                          tg3_asic_rev(tp) != ASIC_REV_5785)
    2032                 :          0 :                         mac_mode |= MAC_MODE_PORT_MODE_GMII;
    2033                 :            :                 else
    2034                 :          0 :                         mac_mode |= MAC_MODE_PORT_MODE_MII;
    2035                 :            : 
    2036         [ #  # ]:          0 :                 if (phydev->duplex == DUPLEX_HALF)
    2037                 :          0 :                         mac_mode |= MAC_MODE_HALF_DUPLEX;
    2038                 :            :                 else {
    2039                 :          0 :                         lcl_adv = mii_advertise_flowctrl(
    2040         [ #  # ]:          0 :                                   tp->link_config.flowctrl);
    2041                 :            : 
    2042         [ #  # ]:          0 :                         if (phydev->pause)
    2043                 :          0 :                                 rmt_adv = LPA_PAUSE_CAP;
    2044         [ #  # ]:          0 :                         if (phydev->asym_pause)
    2045                 :          0 :                                 rmt_adv |= LPA_PAUSE_ASYM;
    2046                 :            :                 }
    2047                 :            : 
    2048                 :          0 :                 tg3_setup_flow_control(tp, lcl_adv, rmt_adv);
    2049                 :            :         } else
    2050                 :          0 :                 mac_mode |= MAC_MODE_PORT_MODE_GMII;
    2051                 :            : 
    2052         [ #  # ]:          0 :         if (mac_mode != tp->mac_mode) {
    2053                 :          0 :                 tp->mac_mode = mac_mode;
    2054                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    2055                 :          0 :                 udelay(40);
    2056                 :            :         }
    2057                 :            : 
    2058         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5785) {
    2059         [ #  # ]:          0 :                 if (phydev->speed == SPEED_10)
    2060                 :          0 :                         tw32(MAC_MI_STAT,
    2061                 :            :                              MAC_MI_STAT_10MBPS_MODE |
    2062                 :            :                              MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
    2063                 :            :                 else
    2064                 :          0 :                         tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
    2065                 :            :         }
    2066                 :            : 
    2067         [ #  # ]:          0 :         if (phydev->speed == SPEED_1000 && phydev->duplex == DUPLEX_HALF)
    2068                 :          0 :                 tw32(MAC_TX_LENGTHS,
    2069                 :            :                      ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
    2070                 :            :                       (6 << TX_LENGTHS_IPG_SHIFT) |
    2071                 :            :                       (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)));
    2072                 :            :         else
    2073                 :          0 :                 tw32(MAC_TX_LENGTHS,
    2074                 :            :                      ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
    2075                 :            :                       (6 << TX_LENGTHS_IPG_SHIFT) |
    2076                 :            :                       (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
    2077                 :            : 
    2078         [ #  # ]:          0 :         if (phydev->link != tp->old_link ||
    2079         [ #  # ]:          0 :             phydev->speed != tp->link_config.active_speed ||
    2080         [ #  # ]:          0 :             phydev->duplex != tp->link_config.active_duplex ||
    2081         [ #  # ]:          0 :             oldflowctrl != tp->link_config.active_flowctrl)
    2082                 :          0 :                 linkmesg = 1;
    2083                 :            : 
    2084                 :          0 :         tp->old_link = phydev->link;
    2085                 :          0 :         tp->link_config.active_speed = phydev->speed;
    2086                 :          0 :         tp->link_config.active_duplex = phydev->duplex;
    2087                 :            : 
    2088                 :          0 :         spin_unlock_bh(&tp->lock);
    2089                 :            : 
    2090         [ #  # ]:          0 :         if (linkmesg)
    2091                 :          0 :                 tg3_link_report(tp);
    2092                 :          0 : }
    2093                 :            : 
    2094                 :          0 : static int tg3_phy_init(struct tg3 *tp)
    2095                 :            : {
    2096                 :          0 :         struct phy_device *phydev;
    2097                 :            : 
    2098         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)
    2099                 :            :                 return 0;
    2100                 :            : 
    2101                 :            :         /* Bring the PHY back to a known state. */
    2102                 :          0 :         tg3_bmcr_reset(tp);
    2103                 :            : 
    2104                 :          0 :         phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
    2105                 :            : 
    2106                 :            :         /* Attach the MAC to the PHY. */
    2107         [ #  # ]:          0 :         phydev = phy_connect(tp->dev, phydev_name(phydev),
    2108                 :            :                              tg3_adjust_link, phydev->interface);
    2109         [ #  # ]:          0 :         if (IS_ERR(phydev)) {
    2110                 :          0 :                 dev_err(&tp->pdev->dev, "Could not attach to PHY\n");
    2111                 :          0 :                 return PTR_ERR(phydev);
    2112                 :            :         }
    2113                 :            : 
    2114                 :            :         /* Mask with MAC supported features. */
    2115      [ #  #  # ]:          0 :         switch (phydev->interface) {
    2116                 :          0 :         case PHY_INTERFACE_MODE_GMII:
    2117                 :            :         case PHY_INTERFACE_MODE_RGMII:
    2118         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
    2119                 :          0 :                         phy_set_max_speed(phydev, SPEED_1000);
    2120                 :          0 :                         phy_support_asym_pause(phydev);
    2121                 :          0 :                         break;
    2122                 :            :                 }
    2123                 :            :                 /* fall through */
    2124                 :            :         case PHY_INTERFACE_MODE_MII:
    2125                 :          0 :                 phy_set_max_speed(phydev, SPEED_100);
    2126                 :          0 :                 phy_support_asym_pause(phydev);
    2127                 :          0 :                 break;
    2128                 :          0 :         default:
    2129                 :          0 :                 phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr));
    2130                 :          0 :                 return -EINVAL;
    2131                 :            :         }
    2132                 :            : 
    2133                 :          0 :         tp->phy_flags |= TG3_PHYFLG_IS_CONNECTED;
    2134                 :            : 
    2135                 :          0 :         phy_attached_info(phydev);
    2136                 :            : 
    2137                 :          0 :         return 0;
    2138                 :            : }
    2139                 :            : 
    2140                 :          0 : static void tg3_phy_start(struct tg3 *tp)
    2141                 :            : {
    2142                 :          0 :         struct phy_device *phydev;
    2143                 :            : 
    2144         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
    2145                 :            :                 return;
    2146                 :            : 
    2147                 :          0 :         phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
    2148                 :            : 
    2149         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
    2150                 :          0 :                 tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER;
    2151                 :          0 :                 phydev->speed = tp->link_config.speed;
    2152                 :          0 :                 phydev->duplex = tp->link_config.duplex;
    2153                 :          0 :                 phydev->autoneg = tp->link_config.autoneg;
    2154                 :          0 :                 ethtool_convert_legacy_u32_to_link_mode(
    2155                 :          0 :                         phydev->advertising, tp->link_config.advertising);
    2156                 :            :         }
    2157                 :            : 
    2158                 :          0 :         phy_start(phydev);
    2159                 :            : 
    2160                 :          0 :         phy_start_aneg(phydev);
    2161                 :            : }
    2162                 :            : 
    2163                 :          0 : static void tg3_phy_stop(struct tg3 *tp)
    2164                 :            : {
    2165         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
    2166                 :            :                 return;
    2167                 :            : 
    2168                 :          0 :         phy_stop(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr));
    2169                 :            : }
    2170                 :            : 
    2171                 :          0 : static void tg3_phy_fini(struct tg3 *tp)
    2172                 :            : {
    2173         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) {
    2174                 :          0 :                 phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr));
    2175                 :          0 :                 tp->phy_flags &= ~TG3_PHYFLG_IS_CONNECTED;
    2176                 :            :         }
    2177                 :          0 : }
    2178                 :            : 
    2179                 :          0 : static int tg3_phy_set_extloopbk(struct tg3 *tp)
    2180                 :            : {
    2181                 :          0 :         int err;
    2182                 :          0 :         u32 val;
    2183                 :            : 
    2184         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_FET)
    2185                 :            :                 return 0;
    2186                 :            : 
    2187         [ #  # ]:          0 :         if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
    2188                 :            :                 /* Cannot do read-modify-write on 5401 */
    2189                 :          0 :                 err = tg3_phy_auxctl_write(tp,
    2190                 :            :                                            MII_TG3_AUXCTL_SHDWSEL_AUXCTL,
    2191                 :            :                                            MII_TG3_AUXCTL_ACTL_EXTLOOPBK |
    2192                 :            :                                            0x4c20);
    2193                 :          0 :                 goto done;
    2194                 :            :         }
    2195                 :            : 
    2196                 :          0 :         err = tg3_phy_auxctl_read(tp,
    2197                 :            :                                   MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val);
    2198         [ #  # ]:          0 :         if (err)
    2199                 :            :                 return err;
    2200                 :            : 
    2201                 :          0 :         val |= MII_TG3_AUXCTL_ACTL_EXTLOOPBK;
    2202                 :          0 :         err = tg3_phy_auxctl_write(tp,
    2203                 :            :                                    MII_TG3_AUXCTL_SHDWSEL_AUXCTL, val);
    2204                 :            : 
    2205                 :            : done:
    2206                 :            :         return err;
    2207                 :            : }
    2208                 :            : 
    2209                 :          0 : static void tg3_phy_fet_toggle_apd(struct tg3 *tp, bool enable)
    2210                 :            : {
    2211                 :          0 :         u32 phytest;
    2212                 :            : 
    2213         [ #  # ]:          0 :         if (!tg3_readphy(tp, MII_TG3_FET_TEST, &phytest)) {
    2214                 :          0 :                 u32 phy;
    2215                 :            : 
    2216                 :          0 :                 tg3_writephy(tp, MII_TG3_FET_TEST,
    2217                 :            :                              phytest | MII_TG3_FET_SHADOW_EN);
    2218         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_TG3_FET_SHDW_AUXSTAT2, &phy)) {
    2219         [ #  # ]:          0 :                         if (enable)
    2220                 :          0 :                                 phy |= MII_TG3_FET_SHDW_AUXSTAT2_APD;
    2221                 :            :                         else
    2222                 :          0 :                                 phy &= ~MII_TG3_FET_SHDW_AUXSTAT2_APD;
    2223                 :          0 :                         tg3_writephy(tp, MII_TG3_FET_SHDW_AUXSTAT2, phy);
    2224                 :            :                 }
    2225                 :          0 :                 tg3_writephy(tp, MII_TG3_FET_TEST, phytest);
    2226                 :            :         }
    2227                 :          0 : }
    2228                 :            : 
    2229                 :          0 : static void tg3_phy_toggle_apd(struct tg3 *tp, bool enable)
    2230                 :            : {
    2231                 :          0 :         u32 reg;
    2232                 :            : 
    2233   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS) ||
    2234                 :          0 :             (tg3_flag(tp, 5717_PLUS) &&
    2235         [ #  # ]:          0 :              (tp->phy_flags & TG3_PHYFLG_MII_SERDES)))
    2236                 :          0 :                 return;
    2237                 :            : 
    2238         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
    2239                 :          0 :                 tg3_phy_fet_toggle_apd(tp, enable);
    2240                 :          0 :                 return;
    2241                 :            :         }
    2242                 :            : 
    2243                 :          0 :         reg = MII_TG3_MISC_SHDW_SCR5_LPED |
    2244                 :            :               MII_TG3_MISC_SHDW_SCR5_DLPTLM |
    2245                 :            :               MII_TG3_MISC_SHDW_SCR5_SDTL |
    2246                 :            :               MII_TG3_MISC_SHDW_SCR5_C125OE;
    2247   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5784 || !enable)
    2248                 :          0 :                 reg |= MII_TG3_MISC_SHDW_SCR5_DLLAPD;
    2249                 :            : 
    2250                 :          0 :         tg3_phy_shdw_write(tp, MII_TG3_MISC_SHDW_SCR5_SEL, reg);
    2251                 :            : 
    2252                 :            : 
    2253                 :          0 :         reg = MII_TG3_MISC_SHDW_APD_WKTM_84MS;
    2254         [ #  # ]:          0 :         if (enable)
    2255                 :          0 :                 reg |= MII_TG3_MISC_SHDW_APD_ENABLE;
    2256                 :            : 
    2257                 :          0 :         tg3_phy_shdw_write(tp, MII_TG3_MISC_SHDW_APD_SEL, reg);
    2258                 :            : }
    2259                 :            : 
    2260                 :          0 : static void tg3_phy_toggle_automdix(struct tg3 *tp, bool enable)
    2261                 :            : {
    2262                 :          0 :         u32 phy;
    2263                 :            : 
    2264         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS) ||
    2265         [ #  # ]:          0 :             (tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
    2266                 :          0 :                 return;
    2267                 :            : 
    2268         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
    2269                 :          0 :                 u32 ephy;
    2270                 :            : 
    2271         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_TG3_FET_TEST, &ephy)) {
    2272                 :          0 :                         u32 reg = MII_TG3_FET_SHDW_MISCCTRL;
    2273                 :            : 
    2274                 :          0 :                         tg3_writephy(tp, MII_TG3_FET_TEST,
    2275                 :            :                                      ephy | MII_TG3_FET_SHADOW_EN);
    2276         [ #  # ]:          0 :                         if (!tg3_readphy(tp, reg, &phy)) {
    2277         [ #  # ]:          0 :                                 if (enable)
    2278                 :          0 :                                         phy |= MII_TG3_FET_SHDW_MISCCTRL_MDIX;
    2279                 :            :                                 else
    2280                 :          0 :                                         phy &= ~MII_TG3_FET_SHDW_MISCCTRL_MDIX;
    2281                 :          0 :                                 tg3_writephy(tp, reg, phy);
    2282                 :            :                         }
    2283                 :          0 :                         tg3_writephy(tp, MII_TG3_FET_TEST, ephy);
    2284                 :            :                 }
    2285                 :            :         } else {
    2286                 :          0 :                 int ret;
    2287                 :            : 
    2288                 :          0 :                 ret = tg3_phy_auxctl_read(tp,
    2289                 :            :                                           MII_TG3_AUXCTL_SHDWSEL_MISC, &phy);
    2290         [ #  # ]:          0 :                 if (!ret) {
    2291         [ #  # ]:          0 :                         if (enable)
    2292                 :          0 :                                 phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
    2293                 :            :                         else
    2294                 :          0 :                                 phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
    2295                 :          0 :                         tg3_phy_auxctl_write(tp,
    2296                 :            :                                              MII_TG3_AUXCTL_SHDWSEL_MISC, phy);
    2297                 :            :                 }
    2298                 :            :         }
    2299                 :            : }
    2300                 :            : 
    2301                 :          0 : static void tg3_phy_set_wirespeed(struct tg3 *tp)
    2302                 :            : {
    2303                 :          0 :         int ret;
    2304                 :          0 :         u32 val;
    2305                 :            : 
    2306         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_NO_ETH_WIRE_SPEED)
    2307                 :          0 :                 return;
    2308                 :            : 
    2309                 :          0 :         ret = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, &val);
    2310         [ #  # ]:          0 :         if (!ret)
    2311                 :          0 :                 tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_MISC,
    2312                 :            :                                      val | MII_TG3_AUXCTL_MISC_WIRESPD_EN);
    2313                 :            : }
    2314                 :            : 
    2315                 :          0 : static void tg3_phy_apply_otp(struct tg3 *tp)
    2316                 :            : {
    2317                 :          0 :         u32 otp, phy;
    2318                 :            : 
    2319         [ #  # ]:          0 :         if (!tp->phy_otp)
    2320                 :            :                 return;
    2321                 :            : 
    2322                 :          0 :         otp = tp->phy_otp;
    2323                 :            : 
    2324         [ #  # ]:          0 :         if (tg3_phy_toggle_auxctl_smdsp(tp, true))
    2325                 :            :                 return;
    2326                 :            : 
    2327                 :          0 :         phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
    2328                 :          0 :         phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT;
    2329                 :          0 :         tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy);
    2330                 :            : 
    2331                 :          0 :         phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) |
    2332                 :            :               ((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT);
    2333                 :          0 :         tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy);
    2334                 :            : 
    2335                 :          0 :         phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT);
    2336                 :          0 :         phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ;
    2337                 :          0 :         tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy);
    2338                 :            : 
    2339                 :          0 :         phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT);
    2340                 :          0 :         tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy);
    2341                 :            : 
    2342                 :          0 :         phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT);
    2343                 :          0 :         tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy);
    2344                 :            : 
    2345                 :          0 :         phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) |
    2346                 :          0 :               ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
    2347                 :          0 :         tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
    2348                 :            : 
    2349                 :          0 :         tg3_phy_toggle_auxctl_smdsp(tp, false);
    2350                 :            : }
    2351                 :            : 
    2352                 :          0 : static void tg3_eee_pull_config(struct tg3 *tp, struct ethtool_eee *eee)
    2353                 :            : {
    2354                 :          0 :         u32 val;
    2355                 :          0 :         struct ethtool_eee *dest = &tp->eee;
    2356                 :            : 
    2357         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP))
    2358                 :          0 :                 return;
    2359                 :            : 
    2360         [ #  # ]:          0 :         if (eee)
    2361                 :          0 :                 dest = eee;
    2362                 :            : 
    2363         [ #  # ]:          0 :         if (tg3_phy_cl45_read(tp, MDIO_MMD_AN, TG3_CL45_D7_EEERES_STAT, &val))
    2364                 :            :                 return;
    2365                 :            : 
    2366                 :            :         /* Pull eee_active */
    2367         [ #  # ]:          0 :         if (val == TG3_CL45_D7_EEERES_STAT_LP_1000T ||
    2368                 :            :             val == TG3_CL45_D7_EEERES_STAT_LP_100TX) {
    2369                 :          0 :                 dest->eee_active = 1;
    2370                 :            :         } else
    2371                 :          0 :                 dest->eee_active = 0;
    2372                 :            : 
    2373                 :            :         /* Pull lp advertised settings */
    2374         [ #  # ]:          0 :         if (tg3_phy_cl45_read(tp, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE, &val))
    2375                 :            :                 return;
    2376                 :          0 :         dest->lp_advertised = mmd_eee_adv_to_ethtool_adv_t(val);
    2377                 :            : 
    2378                 :            :         /* Pull advertised and eee_enabled settings */
    2379         [ #  # ]:          0 :         if (tg3_phy_cl45_read(tp, MDIO_MMD_AN, MDIO_AN_EEE_ADV, &val))
    2380                 :            :                 return;
    2381                 :          0 :         dest->eee_enabled = !!val;
    2382                 :          0 :         dest->advertised = mmd_eee_adv_to_ethtool_adv_t(val);
    2383                 :            : 
    2384                 :            :         /* Pull tx_lpi_enabled */
    2385                 :          0 :         val = tr32(TG3_CPMU_EEE_MODE);
    2386                 :          0 :         dest->tx_lpi_enabled = !!(val & TG3_CPMU_EEEMD_LPI_IN_TX);
    2387                 :            : 
    2388                 :            :         /* Pull lpi timer value */
    2389                 :          0 :         dest->tx_lpi_timer = tr32(TG3_CPMU_EEE_DBTMR1) & 0xffff;
    2390                 :            : }
    2391                 :            : 
    2392                 :          0 : static void tg3_phy_eee_adjust(struct tg3 *tp, bool current_link_up)
    2393                 :            : {
    2394                 :          0 :         u32 val;
    2395                 :            : 
    2396         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP))
    2397                 :            :                 return;
    2398                 :            : 
    2399                 :          0 :         tp->setlpicnt = 0;
    2400                 :            : 
    2401   [ #  #  #  # ]:          0 :         if (tp->link_config.autoneg == AUTONEG_ENABLE &&
    2402                 :          0 :             current_link_up &&
    2403         [ #  # ]:          0 :             tp->link_config.active_duplex == DUPLEX_FULL &&
    2404         [ #  # ]:          0 :             (tp->link_config.active_speed == SPEED_100 ||
    2405                 :            :              tp->link_config.active_speed == SPEED_1000)) {
    2406                 :          0 :                 u32 eeectl;
    2407                 :            : 
    2408         [ #  # ]:          0 :                 if (tp->link_config.active_speed == SPEED_1000)
    2409                 :            :                         eeectl = TG3_CPMU_EEE_CTRL_EXIT_16_5_US;
    2410                 :            :                 else
    2411                 :          0 :                         eeectl = TG3_CPMU_EEE_CTRL_EXIT_36_US;
    2412                 :            : 
    2413                 :          0 :                 tw32(TG3_CPMU_EEE_CTRL, eeectl);
    2414                 :            : 
    2415                 :          0 :                 tg3_eee_pull_config(tp, NULL);
    2416         [ #  # ]:          0 :                 if (tp->eee.eee_active)
    2417                 :          0 :                         tp->setlpicnt = 2;
    2418                 :            :         }
    2419                 :            : 
    2420         [ #  # ]:          0 :         if (!tp->setlpicnt) {
    2421   [ #  #  #  # ]:          0 :                 if (current_link_up &&
    2422                 :          0 :                    !tg3_phy_toggle_auxctl_smdsp(tp, true)) {
    2423                 :          0 :                         tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, 0x0000);
    2424                 :          0 :                         tg3_phy_toggle_auxctl_smdsp(tp, false);
    2425                 :            :                 }
    2426                 :            : 
    2427                 :          0 :                 val = tr32(TG3_CPMU_EEE_MODE);
    2428                 :          0 :                 tw32(TG3_CPMU_EEE_MODE, val & ~TG3_CPMU_EEEMD_LPI_ENABLE);
    2429                 :            :         }
    2430                 :            : }
    2431                 :            : 
    2432                 :          0 : static void tg3_phy_eee_enable(struct tg3 *tp)
    2433                 :            : {
    2434                 :          0 :         u32 val;
    2435                 :            : 
    2436         [ #  # ]:          0 :         if (tp->link_config.active_speed == SPEED_1000 &&
    2437         [ #  # ]:          0 :             (tg3_asic_rev(tp) == ASIC_REV_5717 ||
    2438         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_5719 ||
    2439         [ #  # ]:          0 :              tg3_flag(tp, 57765_CLASS)) &&
    2440                 :          0 :             !tg3_phy_toggle_auxctl_smdsp(tp, true)) {
    2441                 :          0 :                 val = MII_TG3_DSP_TAP26_ALNOKO |
    2442                 :            :                       MII_TG3_DSP_TAP26_RMRXSTO;
    2443                 :          0 :                 tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val);
    2444                 :          0 :                 tg3_phy_toggle_auxctl_smdsp(tp, false);
    2445                 :            :         }
    2446                 :            : 
    2447                 :          0 :         val = tr32(TG3_CPMU_EEE_MODE);
    2448                 :          0 :         tw32(TG3_CPMU_EEE_MODE, val | TG3_CPMU_EEEMD_LPI_ENABLE);
    2449                 :          0 : }
    2450                 :            : 
    2451                 :          0 : static int tg3_wait_macro_done(struct tg3 *tp)
    2452                 :            : {
    2453                 :          0 :         int limit = 100;
    2454                 :            : 
    2455         [ #  # ]:          0 :         while (limit--) {
    2456                 :          0 :                 u32 tmp32;
    2457                 :            : 
    2458         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_TG3_DSP_CONTROL, &tmp32)) {
    2459         [ #  # ]:          0 :                         if ((tmp32 & 0x1000) == 0)
    2460                 :            :                                 break;
    2461                 :            :                 }
    2462                 :            :         }
    2463         [ #  # ]:          0 :         if (limit < 0)
    2464                 :          0 :                 return -EBUSY;
    2465                 :            : 
    2466                 :            :         return 0;
    2467                 :            : }
    2468                 :            : 
    2469                 :          0 : static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
    2470                 :            : {
    2471                 :          0 :         static const u32 test_pat[4][6] = {
    2472                 :            :         { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
    2473                 :            :         { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
    2474                 :            :         { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
    2475                 :            :         { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
    2476                 :            :         };
    2477                 :          0 :         int chan;
    2478                 :            : 
    2479         [ #  # ]:          0 :         for (chan = 0; chan < 4; chan++) {
    2480                 :          0 :                 int i;
    2481                 :            : 
    2482                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
    2483                 :          0 :                              (chan * 0x2000) | 0x0200);
    2484                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002);
    2485                 :            : 
    2486         [ #  # ]:          0 :                 for (i = 0; i < 6; i++)
    2487                 :          0 :                         tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
    2488                 :            :                                      test_pat[chan][i]);
    2489                 :            : 
    2490                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202);
    2491         [ #  # ]:          0 :                 if (tg3_wait_macro_done(tp)) {
    2492                 :          0 :                         *resetp = 1;
    2493                 :          0 :                         return -EBUSY;
    2494                 :            :                 }
    2495                 :            : 
    2496                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
    2497                 :            :                              (chan * 0x2000) | 0x0200);
    2498                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0082);
    2499         [ #  # ]:          0 :                 if (tg3_wait_macro_done(tp)) {
    2500                 :          0 :                         *resetp = 1;
    2501                 :          0 :                         return -EBUSY;
    2502                 :            :                 }
    2503                 :            : 
    2504                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0802);
    2505         [ #  # ]:          0 :                 if (tg3_wait_macro_done(tp)) {
    2506                 :          0 :                         *resetp = 1;
    2507                 :          0 :                         return -EBUSY;
    2508                 :            :                 }
    2509                 :            : 
    2510         [ #  # ]:          0 :                 for (i = 0; i < 6; i += 2) {
    2511                 :          0 :                         u32 low, high;
    2512                 :            : 
    2513   [ #  #  #  # ]:          0 :                         if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
    2514         [ #  # ]:          0 :                             tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
    2515                 :          0 :                             tg3_wait_macro_done(tp)) {
    2516                 :          0 :                                 *resetp = 1;
    2517                 :          0 :                                 return -EBUSY;
    2518                 :            :                         }
    2519                 :          0 :                         low &= 0x7fff;
    2520                 :          0 :                         high &= 0x000f;
    2521         [ #  # ]:          0 :                         if (low != test_pat[chan][i] ||
    2522         [ #  # ]:          0 :                             high != test_pat[chan][i+1]) {
    2523                 :          0 :                                 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
    2524                 :          0 :                                 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
    2525                 :          0 :                                 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
    2526                 :            : 
    2527                 :          0 :                                 return -EBUSY;
    2528                 :            :                         }
    2529                 :            :                 }
    2530                 :            :         }
    2531                 :            : 
    2532                 :            :         return 0;
    2533                 :            : }
    2534                 :            : 
    2535                 :          0 : static int tg3_phy_reset_chanpat(struct tg3 *tp)
    2536                 :            : {
    2537                 :          0 :         int chan;
    2538                 :            : 
    2539         [ #  # ]:          0 :         for (chan = 0; chan < 4; chan++) {
    2540                 :          0 :                 int i;
    2541                 :            : 
    2542                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
    2543                 :          0 :                              (chan * 0x2000) | 0x0200);
    2544                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002);
    2545         [ #  # ]:          0 :                 for (i = 0; i < 6; i++)
    2546                 :          0 :                         tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
    2547                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202);
    2548         [ #  # ]:          0 :                 if (tg3_wait_macro_done(tp))
    2549                 :            :                         return -EBUSY;
    2550                 :            :         }
    2551                 :            : 
    2552                 :            :         return 0;
    2553                 :            : }
    2554                 :            : 
    2555                 :          0 : static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
    2556                 :            : {
    2557                 :          0 :         u32 reg32, phy9_orig;
    2558                 :          0 :         int retries, do_phy_reset, err;
    2559                 :            : 
    2560                 :          0 :         retries = 10;
    2561                 :          0 :         do_phy_reset = 1;
    2562                 :          0 :         do {
    2563         [ #  # ]:          0 :                 if (do_phy_reset) {
    2564                 :          0 :                         err = tg3_bmcr_reset(tp);
    2565         [ #  # ]:          0 :                         if (err)
    2566                 :          0 :                                 return err;
    2567                 :          0 :                         do_phy_reset = 0;
    2568                 :            :                 }
    2569                 :            : 
    2570                 :            :                 /* Disable transmitter and interrupt.  */
    2571         [ #  # ]:          0 :                 if (tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32))
    2572                 :          0 :                         continue;
    2573                 :            : 
    2574                 :          0 :                 reg32 |= 0x3000;
    2575                 :          0 :                 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
    2576                 :            : 
    2577                 :            :                 /* Set full-duplex, 1000 mbps.  */
    2578                 :          0 :                 tg3_writephy(tp, MII_BMCR,
    2579                 :            :                              BMCR_FULLDPLX | BMCR_SPEED1000);
    2580                 :            : 
    2581                 :            :                 /* Set to master mode.  */
    2582         [ #  # ]:          0 :                 if (tg3_readphy(tp, MII_CTRL1000, &phy9_orig))
    2583                 :          0 :                         continue;
    2584                 :            : 
    2585                 :          0 :                 tg3_writephy(tp, MII_CTRL1000,
    2586                 :            :                              CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER);
    2587                 :            : 
    2588                 :          0 :                 err = tg3_phy_toggle_auxctl_smdsp(tp, true);
    2589         [ #  # ]:          0 :                 if (err)
    2590                 :          0 :                         return err;
    2591                 :            : 
    2592                 :            :                 /* Block the PHY control access.  */
    2593                 :          0 :                 tg3_phydsp_write(tp, 0x8005, 0x0800);
    2594                 :            : 
    2595                 :          0 :                 err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
    2596         [ #  # ]:          0 :                 if (!err)
    2597                 :            :                         break;
    2598         [ #  # ]:          0 :         } while (--retries);
    2599                 :            : 
    2600                 :          0 :         err = tg3_phy_reset_chanpat(tp);
    2601         [ #  # ]:          0 :         if (err)
    2602                 :            :                 return err;
    2603                 :            : 
    2604                 :          0 :         tg3_phydsp_write(tp, 0x8005, 0x0000);
    2605                 :            : 
    2606                 :          0 :         tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
    2607                 :          0 :         tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0000);
    2608                 :            : 
    2609                 :          0 :         tg3_phy_toggle_auxctl_smdsp(tp, false);
    2610                 :            : 
    2611                 :          0 :         tg3_writephy(tp, MII_CTRL1000, phy9_orig);
    2612                 :            : 
    2613                 :          0 :         err = tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32);
    2614         [ #  # ]:          0 :         if (err)
    2615                 :            :                 return err;
    2616                 :            : 
    2617                 :          0 :         reg32 &= ~0x3000;
    2618                 :          0 :         tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
    2619                 :            : 
    2620                 :          0 :         return 0;
    2621                 :            : }
    2622                 :            : 
    2623                 :          0 : static void tg3_carrier_off(struct tg3 *tp)
    2624                 :            : {
    2625                 :          0 :         netif_carrier_off(tp->dev);
    2626                 :          0 :         tp->link_up = false;
    2627                 :          0 : }
    2628                 :            : 
    2629                 :          0 : static void tg3_warn_mgmt_link_flap(struct tg3 *tp)
    2630                 :            : {
    2631         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF))
    2632                 :          0 :                 netdev_warn(tp->dev,
    2633                 :            :                             "Management side-band traffic will be interrupted during phy settings change\n");
    2634                 :          0 : }
    2635                 :            : 
    2636                 :            : /* This will reset the tigon3 PHY if there is no valid
    2637                 :            :  * link unless the FORCE argument is non-zero.
    2638                 :            :  */
    2639                 :          0 : static int tg3_phy_reset(struct tg3 *tp)
    2640                 :            : {
    2641                 :          0 :         u32 val, cpmuctrl;
    2642                 :          0 :         int err;
    2643                 :            : 
    2644         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    2645                 :          0 :                 val = tr32(GRC_MISC_CFG);
    2646                 :          0 :                 tw32_f(GRC_MISC_CFG, val & ~GRC_MISC_CFG_EPHY_IDDQ);
    2647                 :          0 :                 udelay(40);
    2648                 :            :         }
    2649                 :          0 :         err  = tg3_readphy(tp, MII_BMSR, &val);
    2650                 :          0 :         err |= tg3_readphy(tp, MII_BMSR, &val);
    2651         [ #  # ]:          0 :         if (err != 0)
    2652                 :            :                 return -EBUSY;
    2653                 :            : 
    2654   [ #  #  #  # ]:          0 :         if (netif_running(tp->dev) && tp->link_up) {
    2655                 :          0 :                 netif_carrier_off(tp->dev);
    2656                 :          0 :                 tg3_link_report(tp);
    2657                 :            :         }
    2658                 :            : 
    2659                 :          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5703 ||
    2660         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5704 ||
    2661                 :            :             tg3_asic_rev(tp) == ASIC_REV_5705) {
    2662                 :          0 :                 err = tg3_phy_reset_5703_4_5(tp);
    2663         [ #  # ]:          0 :                 if (err)
    2664                 :            :                         return err;
    2665                 :          0 :                 goto out;
    2666                 :            :         }
    2667                 :            : 
    2668                 :          0 :         cpmuctrl = 0;
    2669         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5784 &&
    2670         [ #  # ]:          0 :             tg3_chip_rev(tp) != CHIPREV_5784_AX) {
    2671                 :          0 :                 cpmuctrl = tr32(TG3_CPMU_CTRL);
    2672         [ #  # ]:          0 :                 if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY)
    2673                 :          0 :                         tw32(TG3_CPMU_CTRL,
    2674                 :            :                              cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY);
    2675                 :            :         }
    2676                 :            : 
    2677                 :          0 :         err = tg3_bmcr_reset(tp);
    2678         [ #  # ]:          0 :         if (err)
    2679                 :            :                 return err;
    2680                 :            : 
    2681         [ #  # ]:          0 :         if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) {
    2682                 :          0 :                 val = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz;
    2683                 :          0 :                 tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, val);
    2684                 :            : 
    2685                 :          0 :                 tw32(TG3_CPMU_CTRL, cpmuctrl);
    2686                 :            :         }
    2687                 :            : 
    2688         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5784_AX ||
    2689                 :            :             tg3_chip_rev(tp) == CHIPREV_5761_AX) {
    2690                 :          0 :                 val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
    2691         [ #  # ]:          0 :                 if ((val & CPMU_LSPD_1000MB_MACCLK_MASK) ==
    2692                 :            :                     CPMU_LSPD_1000MB_MACCLK_12_5) {
    2693                 :          0 :                         val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
    2694                 :          0 :                         udelay(40);
    2695                 :          0 :                         tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val);
    2696                 :            :                 }
    2697                 :            :         }
    2698                 :            : 
    2699         [ #  # ]:          0 :         if (tg3_flag(tp, 5717_PLUS) &&
    2700         [ #  # ]:          0 :             (tp->phy_flags & TG3_PHYFLG_MII_SERDES))
    2701                 :            :                 return 0;
    2702                 :            : 
    2703                 :          0 :         tg3_phy_apply_otp(tp);
    2704                 :            : 
    2705         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_ENABLE_APD)
    2706                 :          0 :                 tg3_phy_toggle_apd(tp, true);
    2707                 :            :         else
    2708                 :          0 :                 tg3_phy_toggle_apd(tp, false);
    2709                 :            : 
    2710                 :          0 : out:
    2711   [ #  #  #  # ]:          0 :         if ((tp->phy_flags & TG3_PHYFLG_ADC_BUG) &&
    2712                 :          0 :             !tg3_phy_toggle_auxctl_smdsp(tp, true)) {
    2713                 :          0 :                 tg3_phydsp_write(tp, 0x201f, 0x2aaa);
    2714                 :          0 :                 tg3_phydsp_write(tp, 0x000a, 0x0323);
    2715                 :          0 :                 tg3_phy_toggle_auxctl_smdsp(tp, false);
    2716                 :            :         }
    2717                 :            : 
    2718         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_5704_A0_BUG) {
    2719                 :          0 :                 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
    2720                 :          0 :                 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
    2721                 :            :         }
    2722                 :            : 
    2723         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_BER_BUG) {
    2724         [ #  # ]:          0 :                 if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) {
    2725                 :          0 :                         tg3_phydsp_write(tp, 0x000a, 0x310b);
    2726                 :          0 :                         tg3_phydsp_write(tp, 0x201f, 0x9506);
    2727                 :          0 :                         tg3_phydsp_write(tp, 0x401f, 0x14e2);
    2728                 :          0 :                         tg3_phy_toggle_auxctl_smdsp(tp, false);
    2729                 :            :                 }
    2730         [ #  # ]:          0 :         } else if (tp->phy_flags & TG3_PHYFLG_JITTER_BUG) {
    2731         [ #  # ]:          0 :                 if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) {
    2732                 :          0 :                         tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
    2733         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_ADJUST_TRIM) {
    2734                 :          0 :                                 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b);
    2735                 :          0 :                                 tg3_writephy(tp, MII_TG3_TEST1,
    2736                 :            :                                              MII_TG3_TEST1_TRIM_EN | 0x4);
    2737                 :            :                         } else
    2738                 :          0 :                                 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
    2739                 :            : 
    2740                 :          0 :                         tg3_phy_toggle_auxctl_smdsp(tp, false);
    2741                 :            :                 }
    2742                 :            :         }
    2743                 :            : 
    2744                 :            :         /* Set Extended packet length bit (bit 14) on all chips that */
    2745                 :            :         /* support jumbo frames */
    2746         [ #  # ]:          0 :         if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
    2747                 :            :                 /* Cannot do read-modify-write on 5401 */
    2748                 :          0 :                 tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
    2749         [ #  # ]:          0 :         } else if (tg3_flag(tp, JUMBO_CAPABLE)) {
    2750                 :            :                 /* Set bit 14 with read-modify-write to preserve other bits */
    2751                 :          0 :                 err = tg3_phy_auxctl_read(tp,
    2752                 :            :                                           MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val);
    2753         [ #  # ]:          0 :                 if (!err)
    2754                 :          0 :                         tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL,
    2755                 :            :                                            val | MII_TG3_AUXCTL_ACTL_EXTPKTLEN);
    2756                 :            :         }
    2757                 :            : 
    2758                 :            :         /* Set phy register 0x10 bit 0 to high fifo elasticity to support
    2759                 :            :          * jumbo frames transmission.
    2760                 :            :          */
    2761         [ #  # ]:          0 :         if (tg3_flag(tp, JUMBO_CAPABLE)) {
    2762         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &val))
    2763                 :          0 :                         tg3_writephy(tp, MII_TG3_EXT_CTRL,
    2764                 :            :                                      val | MII_TG3_EXT_CTRL_FIFO_ELASTIC);
    2765                 :            :         }
    2766                 :            : 
    2767         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    2768                 :            :                 /* adjust output voltage */
    2769                 :          0 :                 tg3_writephy(tp, MII_TG3_FET_PTEST, 0x12);
    2770                 :            :         }
    2771                 :            : 
    2772         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5762_A0)
    2773                 :          0 :                 tg3_phydsp_write(tp, 0xffb, 0x4000);
    2774                 :            : 
    2775                 :          0 :         tg3_phy_toggle_automdix(tp, true);
    2776                 :          0 :         tg3_phy_set_wirespeed(tp);
    2777                 :          0 :         return 0;
    2778                 :            : }
    2779                 :            : 
    2780                 :            : #define TG3_GPIO_MSG_DRVR_PRES           0x00000001
    2781                 :            : #define TG3_GPIO_MSG_NEED_VAUX           0x00000002
    2782                 :            : #define TG3_GPIO_MSG_MASK                (TG3_GPIO_MSG_DRVR_PRES | \
    2783                 :            :                                           TG3_GPIO_MSG_NEED_VAUX)
    2784                 :            : #define TG3_GPIO_MSG_ALL_DRVR_PRES_MASK \
    2785                 :            :         ((TG3_GPIO_MSG_DRVR_PRES << 0) | \
    2786                 :            :          (TG3_GPIO_MSG_DRVR_PRES << 4) | \
    2787                 :            :          (TG3_GPIO_MSG_DRVR_PRES << 8) | \
    2788                 :            :          (TG3_GPIO_MSG_DRVR_PRES << 12))
    2789                 :            : 
    2790                 :            : #define TG3_GPIO_MSG_ALL_NEED_VAUX_MASK \
    2791                 :            :         ((TG3_GPIO_MSG_NEED_VAUX << 0) | \
    2792                 :            :          (TG3_GPIO_MSG_NEED_VAUX << 4) | \
    2793                 :            :          (TG3_GPIO_MSG_NEED_VAUX << 8) | \
    2794                 :            :          (TG3_GPIO_MSG_NEED_VAUX << 12))
    2795                 :            : 
    2796                 :          0 : static inline u32 tg3_set_function_status(struct tg3 *tp, u32 newstat)
    2797                 :            : {
    2798                 :          0 :         u32 status, shift;
    2799                 :            : 
    2800         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
    2801                 :            :             tg3_asic_rev(tp) == ASIC_REV_5719)
    2802                 :          0 :                 status = tg3_ape_read32(tp, TG3_APE_GPIO_MSG);
    2803                 :            :         else
    2804                 :          0 :                 status = tr32(TG3_CPMU_DRV_STATUS);
    2805                 :            : 
    2806                 :          0 :         shift = TG3_APE_GPIO_MSG_SHIFT + 4 * tp->pci_fn;
    2807                 :          0 :         status &= ~(TG3_GPIO_MSG_MASK << shift);
    2808                 :          0 :         status |= (newstat << shift);
    2809                 :            : 
    2810         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
    2811                 :            :             tg3_asic_rev(tp) == ASIC_REV_5719)
    2812                 :          0 :                 tg3_ape_write32(tp, TG3_APE_GPIO_MSG, status);
    2813                 :            :         else
    2814                 :          0 :                 tw32(TG3_CPMU_DRV_STATUS, status);
    2815                 :            : 
    2816                 :          0 :         return status >> TG3_APE_GPIO_MSG_SHIFT;
    2817                 :            : }
    2818                 :            : 
    2819                 :          0 : static inline int tg3_pwrsrc_switch_to_vmain(struct tg3 *tp)
    2820                 :            : {
    2821         [ #  # ]:          0 :         if (!tg3_flag(tp, IS_NIC))
    2822                 :            :                 return 0;
    2823                 :            : 
    2824         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
    2825         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5719 ||
    2826                 :            :             tg3_asic_rev(tp) == ASIC_REV_5720) {
    2827         [ #  # ]:          0 :                 if (tg3_ape_lock(tp, TG3_APE_LOCK_GPIO))
    2828                 :            :                         return -EIO;
    2829                 :            : 
    2830                 :          0 :                 tg3_set_function_status(tp, TG3_GPIO_MSG_DRVR_PRES);
    2831                 :            : 
    2832                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl,
    2833                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2834                 :            : 
    2835                 :          0 :                 tg3_ape_unlock(tp, TG3_APE_LOCK_GPIO);
    2836                 :            :         } else {
    2837                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl,
    2838                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2839                 :            :         }
    2840                 :            : 
    2841                 :            :         return 0;
    2842                 :            : }
    2843                 :            : 
    2844                 :          0 : static void tg3_pwrsrc_die_with_vmain(struct tg3 *tp)
    2845                 :            : {
    2846                 :          0 :         u32 grc_local_ctrl;
    2847                 :            : 
    2848         [ #  # ]:          0 :         if (!tg3_flag(tp, IS_NIC) ||
    2849   [ #  #  #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5700 ||
    2850                 :            :             tg3_asic_rev(tp) == ASIC_REV_5701)
    2851                 :            :                 return;
    2852                 :            : 
    2853                 :          0 :         grc_local_ctrl = tp->grc_local_ctrl | GRC_LCLCTRL_GPIO_OE1;
    2854                 :            : 
    2855                 :          0 :         tw32_wait_f(GRC_LOCAL_CTRL,
    2856                 :            :                     grc_local_ctrl | GRC_LCLCTRL_GPIO_OUTPUT1,
    2857                 :            :                     TG3_GRC_LCLCTL_PWRSW_DELAY);
    2858                 :            : 
    2859                 :          0 :         tw32_wait_f(GRC_LOCAL_CTRL,
    2860                 :            :                     grc_local_ctrl,
    2861                 :            :                     TG3_GRC_LCLCTL_PWRSW_DELAY);
    2862                 :            : 
    2863                 :          0 :         tw32_wait_f(GRC_LOCAL_CTRL,
    2864                 :            :                     grc_local_ctrl | GRC_LCLCTRL_GPIO_OUTPUT1,
    2865                 :            :                     TG3_GRC_LCLCTL_PWRSW_DELAY);
    2866                 :            : }
    2867                 :            : 
    2868                 :          0 : static void tg3_pwrsrc_switch_to_vaux(struct tg3 *tp)
    2869                 :            : {
    2870         [ #  # ]:          0 :         if (!tg3_flag(tp, IS_NIC))
    2871                 :            :                 return;
    2872                 :            : 
    2873         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
    2874                 :            :             tg3_asic_rev(tp) == ASIC_REV_5701) {
    2875                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
    2876                 :            :                             (GRC_LCLCTRL_GPIO_OE0 |
    2877                 :            :                              GRC_LCLCTRL_GPIO_OE1 |
    2878                 :            :                              GRC_LCLCTRL_GPIO_OE2 |
    2879                 :            :                              GRC_LCLCTRL_GPIO_OUTPUT0 |
    2880                 :            :                              GRC_LCLCTRL_GPIO_OUTPUT1),
    2881                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2882         [ #  # ]:          0 :         } else if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 ||
    2883                 :            :                    tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S) {
    2884                 :            :                 /* The 5761 non-e device swaps GPIO 0 and GPIO 2. */
    2885                 :          0 :                 u32 grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 |
    2886                 :            :                                      GRC_LCLCTRL_GPIO_OE1 |
    2887                 :            :                                      GRC_LCLCTRL_GPIO_OE2 |
    2888                 :            :                                      GRC_LCLCTRL_GPIO_OUTPUT0 |
    2889                 :            :                                      GRC_LCLCTRL_GPIO_OUTPUT1 |
    2890                 :          0 :                                      tp->grc_local_ctrl;
    2891                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl,
    2892                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2893                 :            : 
    2894                 :          0 :                 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT2;
    2895                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl,
    2896                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2897                 :            : 
    2898                 :          0 :                 grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT0;
    2899                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl,
    2900                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2901                 :            :         } else {
    2902                 :          0 :                 u32 no_gpio2;
    2903                 :          0 :                 u32 grc_local_ctrl = 0;
    2904                 :            : 
    2905                 :            :                 /* Workaround to prevent overdrawing Amps. */
    2906         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5714) {
    2907                 :          0 :                         grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
    2908                 :          0 :                         tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
    2909                 :            :                                     grc_local_ctrl,
    2910                 :            :                                     TG3_GRC_LCLCTL_PWRSW_DELAY);
    2911                 :            :                 }
    2912                 :            : 
    2913                 :            :                 /* On 5753 and variants, GPIO2 cannot be used. */
    2914                 :          0 :                 no_gpio2 = tp->nic_sram_data_cfg &
    2915                 :            :                            NIC_SRAM_DATA_CFG_NO_GPIO2;
    2916                 :            : 
    2917                 :          0 :                 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 |
    2918                 :            :                                   GRC_LCLCTRL_GPIO_OE1 |
    2919                 :            :                                   GRC_LCLCTRL_GPIO_OE2 |
    2920                 :            :                                   GRC_LCLCTRL_GPIO_OUTPUT1 |
    2921                 :            :                                   GRC_LCLCTRL_GPIO_OUTPUT2;
    2922         [ #  # ]:          0 :                 if (no_gpio2) {
    2923                 :          0 :                         grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 |
    2924                 :            :                                             GRC_LCLCTRL_GPIO_OUTPUT2);
    2925                 :            :                 }
    2926                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL,
    2927                 :            :                             tp->grc_local_ctrl | grc_local_ctrl,
    2928                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2929                 :            : 
    2930                 :          0 :                 grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0;
    2931                 :            : 
    2932                 :          0 :                 tw32_wait_f(GRC_LOCAL_CTRL,
    2933                 :            :                             tp->grc_local_ctrl | grc_local_ctrl,
    2934                 :            :                             TG3_GRC_LCLCTL_PWRSW_DELAY);
    2935                 :            : 
    2936         [ #  # ]:          0 :                 if (!no_gpio2) {
    2937                 :          0 :                         grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2;
    2938                 :          0 :                         tw32_wait_f(GRC_LOCAL_CTRL,
    2939                 :            :                                     tp->grc_local_ctrl | grc_local_ctrl,
    2940                 :            :                                     TG3_GRC_LCLCTL_PWRSW_DELAY);
    2941                 :            :                 }
    2942                 :            :         }
    2943                 :            : }
    2944                 :            : 
    2945                 :          0 : static void tg3_frob_aux_power_5717(struct tg3 *tp, bool wol_enable)
    2946                 :            : {
    2947                 :          0 :         u32 msg = 0;
    2948                 :            : 
    2949                 :            :         /* Serialize power state transitions */
    2950         [ #  # ]:          0 :         if (tg3_ape_lock(tp, TG3_APE_LOCK_GPIO))
    2951                 :            :                 return;
    2952                 :            : 
    2953   [ #  #  #  #  :          0 :         if (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE) || wol_enable)
                   #  # ]
    2954                 :            :                 msg = TG3_GPIO_MSG_NEED_VAUX;
    2955                 :            : 
    2956                 :          0 :         msg = tg3_set_function_status(tp, msg);
    2957                 :            : 
    2958         [ #  # ]:          0 :         if (msg & TG3_GPIO_MSG_ALL_DRVR_PRES_MASK)
    2959                 :          0 :                 goto done;
    2960                 :            : 
    2961         [ #  # ]:          0 :         if (msg & TG3_GPIO_MSG_ALL_NEED_VAUX_MASK)
    2962                 :          0 :                 tg3_pwrsrc_switch_to_vaux(tp);
    2963                 :            :         else
    2964                 :          0 :                 tg3_pwrsrc_die_with_vmain(tp);
    2965                 :            : 
    2966                 :          0 : done:
    2967                 :          0 :         tg3_ape_unlock(tp, TG3_APE_LOCK_GPIO);
    2968                 :            : }
    2969                 :            : 
    2970                 :          0 : static void tg3_frob_aux_power(struct tg3 *tp, bool include_wol)
    2971                 :            : {
    2972                 :          0 :         bool need_vaux = false;
    2973                 :            : 
    2974                 :            :         /* The GPIOs do something completely different on 57765. */
    2975   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, IS_NIC) || tg3_flag(tp, 57765_CLASS))
    2976                 :          0 :                 return;
    2977                 :            : 
    2978         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
    2979         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5719 ||
    2980                 :            :             tg3_asic_rev(tp) == ASIC_REV_5720) {
    2981                 :          0 :                 tg3_frob_aux_power_5717(tp, include_wol ?
    2982   [ #  #  #  # ]:          0 :                                         tg3_flag(tp, WOL_ENABLE) != 0 : 0);
    2983                 :          0 :                 return;
    2984                 :            :         }
    2985                 :            : 
    2986   [ #  #  #  # ]:          0 :         if (tp->pdev_peer && tp->pdev_peer != tp->pdev) {
    2987                 :          0 :                 struct net_device *dev_peer;
    2988                 :            : 
    2989         [ #  # ]:          0 :                 dev_peer = pci_get_drvdata(tp->pdev_peer);
    2990                 :            : 
    2991                 :            :                 /* remove_one() may have been run on the peer. */
    2992         [ #  # ]:          0 :                 if (dev_peer) {
    2993                 :          0 :                         struct tg3 *tp_peer = netdev_priv(dev_peer);
    2994                 :            : 
    2995         [ #  # ]:          0 :                         if (tg3_flag(tp_peer, INIT_COMPLETE))
    2996                 :            :                                 return;
    2997                 :            : 
    2998   [ #  #  #  #  :          0 :                         if ((include_wol && tg3_flag(tp_peer, WOL_ENABLE)) ||
                   #  # ]
    2999                 :            :                             tg3_flag(tp_peer, ENABLE_ASF))
    3000                 :            :                                 need_vaux = true;
    3001                 :            :                 }
    3002                 :            :         }
    3003                 :            : 
    3004   [ #  #  #  #  :          0 :         if ((include_wol && tg3_flag(tp, WOL_ENABLE)) ||
                   #  # ]
    3005                 :            :             tg3_flag(tp, ENABLE_ASF))
    3006                 :            :                 need_vaux = true;
    3007                 :            : 
    3008         [ #  # ]:          0 :         if (need_vaux)
    3009                 :          0 :                 tg3_pwrsrc_switch_to_vaux(tp);
    3010                 :            :         else
    3011                 :          0 :                 tg3_pwrsrc_die_with_vmain(tp);
    3012                 :            : }
    3013                 :            : 
    3014                 :          0 : static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed)
    3015                 :            : {
    3016                 :          0 :         if (tp->led_ctrl == LED_CTRL_MODE_PHY_2)
    3017                 :            :                 return 1;
    3018   [ #  #  #  # ]:          0 :         else if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411) {
    3019   [ #  #  #  # ]:          0 :                 if (speed != SPEED_10)
    3020                 :            :                         return 1;
    3021   [ #  #  #  # ]:          0 :         } else if (speed == SPEED_10)
    3022                 :            :                 return 1;
    3023                 :            : 
    3024                 :            :         return 0;
    3025                 :            : }
    3026                 :            : 
    3027                 :          0 : static bool tg3_phy_power_bug(struct tg3 *tp)
    3028                 :            : {
    3029   [ #  #  #  #  :          0 :         switch (tg3_asic_rev(tp)) {
                      # ]
    3030                 :            :         case ASIC_REV_5700:
    3031                 :            :         case ASIC_REV_5704:
    3032                 :            :                 return true;
    3033                 :          0 :         case ASIC_REV_5780:
    3034         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
    3035                 :          0 :                         return true;
    3036                 :            :                 return false;
    3037                 :          0 :         case ASIC_REV_5717:
    3038         [ #  # ]:          0 :                 if (!tp->pci_fn)
    3039                 :          0 :                         return true;
    3040                 :            :                 return false;
    3041                 :          0 :         case ASIC_REV_5719:
    3042                 :            :         case ASIC_REV_5720:
    3043         [ #  # ]:          0 :                 if ((tp->phy_flags & TG3_PHYFLG_PHY_SERDES) &&
    3044         [ #  # ]:          0 :                     !tp->pci_fn)
    3045                 :          0 :                         return true;
    3046                 :            :                 return false;
    3047                 :            :         }
    3048                 :            : 
    3049                 :          0 :         return false;
    3050                 :            : }
    3051                 :            : 
    3052                 :          0 : static bool tg3_phy_led_bug(struct tg3 *tp)
    3053                 :            : {
    3054                 :          0 :         switch (tg3_asic_rev(tp)) {
    3055                 :          0 :         case ASIC_REV_5719:
    3056                 :            :         case ASIC_REV_5720:
    3057         [ #  # ]:          0 :                 if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) &&
    3058         [ #  # ]:          0 :                     !tp->pci_fn)
    3059                 :            :                         return true;
    3060                 :            :                 return false;
    3061                 :            :         }
    3062                 :            : 
    3063                 :            :         return false;
    3064                 :            : }
    3065                 :            : 
    3066                 :          0 : static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power)
    3067                 :            : {
    3068                 :          0 :         u32 val;
    3069                 :            : 
    3070         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN)
    3071                 :            :                 return;
    3072                 :            : 
    3073         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) {
    3074         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5704) {
    3075                 :          0 :                         u32 sg_dig_ctrl = tr32(SG_DIG_CTRL);
    3076                 :          0 :                         u32 serdes_cfg = tr32(MAC_SERDES_CFG);
    3077                 :            : 
    3078                 :          0 :                         sg_dig_ctrl |=
    3079                 :            :                                 SG_DIG_USING_HW_AUTONEG | SG_DIG_SOFT_RESET;
    3080                 :          0 :                         tw32(SG_DIG_CTRL, sg_dig_ctrl);
    3081                 :          0 :                         tw32(MAC_SERDES_CFG, serdes_cfg | (1 << 15));
    3082                 :            :                 }
    3083                 :          0 :                 return;
    3084                 :            :         }
    3085                 :            : 
    3086         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    3087                 :          0 :                 tg3_bmcr_reset(tp);
    3088                 :          0 :                 val = tr32(GRC_MISC_CFG);
    3089                 :          0 :                 tw32_f(GRC_MISC_CFG, val | GRC_MISC_CFG_EPHY_IDDQ);
    3090                 :          0 :                 udelay(40);
    3091                 :          0 :                 return;
    3092         [ #  # ]:          0 :         } else if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
    3093                 :          0 :                 u32 phytest;
    3094         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_TG3_FET_TEST, &phytest)) {
    3095                 :          0 :                         u32 phy;
    3096                 :            : 
    3097                 :          0 :                         tg3_writephy(tp, MII_ADVERTISE, 0);
    3098                 :          0 :                         tg3_writephy(tp, MII_BMCR,
    3099                 :            :                                      BMCR_ANENABLE | BMCR_ANRESTART);
    3100                 :            : 
    3101                 :          0 :                         tg3_writephy(tp, MII_TG3_FET_TEST,
    3102                 :            :                                      phytest | MII_TG3_FET_SHADOW_EN);
    3103         [ #  # ]:          0 :                         if (!tg3_readphy(tp, MII_TG3_FET_SHDW_AUXMODE4, &phy)) {
    3104                 :          0 :                                 phy |= MII_TG3_FET_SHDW_AUXMODE4_SBPD;
    3105                 :          0 :                                 tg3_writephy(tp,
    3106                 :            :                                              MII_TG3_FET_SHDW_AUXMODE4,
    3107                 :            :                                              phy);
    3108                 :            :                         }
    3109                 :          0 :                         tg3_writephy(tp, MII_TG3_FET_TEST, phytest);
    3110                 :            :                 }
    3111                 :          0 :                 return;
    3112         [ #  # ]:          0 :         } else if (do_low_power) {
    3113         [ #  # ]:          0 :                 if (!tg3_phy_led_bug(tp))
    3114                 :          0 :                         tg3_writephy(tp, MII_TG3_EXT_CTRL,
    3115                 :            :                                      MII_TG3_EXT_CTRL_FORCE_LED_OFF);
    3116                 :            : 
    3117                 :          0 :                 val = MII_TG3_AUXCTL_PCTL_100TX_LPWR |
    3118                 :            :                       MII_TG3_AUXCTL_PCTL_SPR_ISOLATE |
    3119                 :            :                       MII_TG3_AUXCTL_PCTL_VREG_11V;
    3120                 :          0 :                 tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, val);
    3121                 :            :         }
    3122                 :            : 
    3123                 :            :         /* The PHY should not be powered down on some chips because
    3124                 :            :          * of bugs.
    3125                 :            :          */
    3126         [ #  # ]:          0 :         if (tg3_phy_power_bug(tp))
    3127                 :            :                 return;
    3128                 :            : 
    3129         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5784_AX ||
    3130                 :            :             tg3_chip_rev(tp) == CHIPREV_5761_AX) {
    3131                 :          0 :                 val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
    3132                 :          0 :                 val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
    3133                 :          0 :                 val |= CPMU_LSPD_1000MB_MACCLK_12_5;
    3134                 :          0 :                 tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val);
    3135                 :            :         }
    3136                 :            : 
    3137                 :          0 :         tg3_writephy(tp, MII_BMCR, BMCR_PDOWN);
    3138                 :            : }
    3139                 :            : 
    3140                 :            : /* tp->lock is held. */
    3141                 :          0 : static int tg3_nvram_lock(struct tg3 *tp)
    3142                 :            : {
    3143         [ #  # ]:          0 :         if (tg3_flag(tp, NVRAM)) {
    3144                 :          0 :                 int i;
    3145                 :            : 
    3146         [ #  # ]:          0 :                 if (tp->nvram_lock_cnt == 0) {
    3147                 :          0 :                         tw32(NVRAM_SWARB, SWARB_REQ_SET1);
    3148         [ #  # ]:          0 :                         for (i = 0; i < 8000; i++) {
    3149         [ #  # ]:          0 :                                 if (tr32(NVRAM_SWARB) & SWARB_GNT1)
    3150                 :            :                                         break;
    3151                 :          0 :                                 udelay(20);
    3152                 :            :                         }
    3153         [ #  # ]:          0 :                         if (i == 8000) {
    3154                 :          0 :                                 tw32(NVRAM_SWARB, SWARB_REQ_CLR1);
    3155                 :          0 :                                 return -ENODEV;
    3156                 :            :                         }
    3157                 :            :                 }
    3158                 :          0 :                 tp->nvram_lock_cnt++;
    3159                 :            :         }
    3160                 :            :         return 0;
    3161                 :            : }
    3162                 :            : 
    3163                 :            : /* tp->lock is held. */
    3164                 :          0 : static void tg3_nvram_unlock(struct tg3 *tp)
    3165                 :            : {
    3166         [ #  # ]:          0 :         if (tg3_flag(tp, NVRAM)) {
    3167         [ #  # ]:          0 :                 if (tp->nvram_lock_cnt > 0)
    3168                 :          0 :                         tp->nvram_lock_cnt--;
    3169         [ #  # ]:          0 :                 if (tp->nvram_lock_cnt == 0)
    3170                 :          0 :                         tw32_f(NVRAM_SWARB, SWARB_REQ_CLR1);
    3171                 :            :         }
    3172                 :          0 : }
    3173                 :            : 
    3174                 :            : /* tp->lock is held. */
    3175                 :          0 : static void tg3_enable_nvram_access(struct tg3 *tp)
    3176                 :            : {
    3177   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM)) {
    3178                 :          0 :                 u32 nvaccess = tr32(NVRAM_ACCESS);
    3179                 :            : 
    3180                 :          0 :                 tw32(NVRAM_ACCESS, nvaccess | ACCESS_ENABLE);
    3181                 :            :         }
    3182                 :          0 : }
    3183                 :            : 
    3184                 :            : /* tp->lock is held. */
    3185                 :          0 : static void tg3_disable_nvram_access(struct tg3 *tp)
    3186                 :            : {
    3187   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM)) {
    3188                 :          0 :                 u32 nvaccess = tr32(NVRAM_ACCESS);
    3189                 :            : 
    3190                 :          0 :                 tw32(NVRAM_ACCESS, nvaccess & ~ACCESS_ENABLE);
    3191                 :            :         }
    3192                 :          0 : }
    3193                 :            : 
    3194                 :          0 : static int tg3_nvram_read_using_eeprom(struct tg3 *tp,
    3195                 :            :                                         u32 offset, u32 *val)
    3196                 :            : {
    3197                 :          0 :         u32 tmp;
    3198                 :          0 :         int i;
    3199                 :            : 
    3200   [ #  #  #  # ]:          0 :         if (offset > EEPROM_ADDR_ADDR_MASK || (offset % 4) != 0)
    3201                 :            :                 return -EINVAL;
    3202                 :            : 
    3203                 :          0 :         tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK |
    3204                 :            :                                         EEPROM_ADDR_DEVID_MASK |
    3205                 :            :                                         EEPROM_ADDR_READ);
    3206                 :          0 :         tw32(GRC_EEPROM_ADDR,
    3207                 :            :              tmp |
    3208                 :            :              (0 << EEPROM_ADDR_DEVID_SHIFT) |
    3209                 :            :              ((offset << EEPROM_ADDR_ADDR_SHIFT) &
    3210                 :            :               EEPROM_ADDR_ADDR_MASK) |
    3211                 :            :              EEPROM_ADDR_READ | EEPROM_ADDR_START);
    3212                 :            : 
    3213         [ #  # ]:          0 :         for (i = 0; i < 1000; i++) {
    3214                 :          0 :                 tmp = tr32(GRC_EEPROM_ADDR);
    3215                 :            : 
    3216         [ #  # ]:          0 :                 if (tmp & EEPROM_ADDR_COMPLETE)
    3217                 :            :                         break;
    3218                 :          0 :                 msleep(1);
    3219                 :            :         }
    3220         [ #  # ]:          0 :         if (!(tmp & EEPROM_ADDR_COMPLETE))
    3221                 :            :                 return -EBUSY;
    3222                 :            : 
    3223                 :          0 :         tmp = tr32(GRC_EEPROM_DATA);
    3224                 :            : 
    3225                 :            :         /*
    3226                 :            :          * The data will always be opposite the native endian
    3227                 :            :          * format.  Perform a blind byteswap to compensate.
    3228                 :            :          */
    3229                 :          0 :         *val = swab32(tmp);
    3230                 :            : 
    3231                 :          0 :         return 0;
    3232                 :            : }
    3233                 :            : 
    3234                 :            : #define NVRAM_CMD_TIMEOUT 10000
    3235                 :            : 
    3236                 :          0 : static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd)
    3237                 :            : {
    3238                 :          0 :         int i;
    3239                 :            : 
    3240                 :          0 :         tw32(NVRAM_CMD, nvram_cmd);
    3241         [ #  # ]:          0 :         for (i = 0; i < NVRAM_CMD_TIMEOUT; i++) {
    3242                 :          0 :                 usleep_range(10, 40);
    3243         [ #  # ]:          0 :                 if (tr32(NVRAM_CMD) & NVRAM_CMD_DONE) {
    3244                 :          0 :                         udelay(10);
    3245                 :            :                         break;
    3246                 :            :                 }
    3247                 :            :         }
    3248                 :            : 
    3249         [ #  # ]:          0 :         if (i == NVRAM_CMD_TIMEOUT)
    3250                 :          0 :                 return -EBUSY;
    3251                 :            : 
    3252                 :            :         return 0;
    3253                 :            : }
    3254                 :            : 
    3255                 :          0 : static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr)
    3256                 :            : {
    3257   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, NVRAM) &&
    3258         [ #  # ]:          0 :             tg3_flag(tp, NVRAM_BUFFERED) &&
    3259         [ #  # ]:          0 :             tg3_flag(tp, FLASH) &&
    3260                 :          0 :             !tg3_flag(tp, NO_NVRAM_ADDR_TRANS) &&
    3261         [ #  # ]:          0 :             (tp->nvram_jedecnum == JEDEC_ATMEL))
    3262                 :            : 
    3263                 :          0 :                 addr = ((addr / tp->nvram_pagesize) <<
    3264                 :            :                         ATMEL_AT45DB0X1B_PAGE_POS) +
    3265                 :          0 :                        (addr % tp->nvram_pagesize);
    3266                 :            : 
    3267                 :          0 :         return addr;
    3268                 :            : }
    3269                 :            : 
    3270                 :          0 : static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr)
    3271                 :            : {
    3272   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, NVRAM) &&
    3273         [ #  # ]:          0 :             tg3_flag(tp, NVRAM_BUFFERED) &&
    3274         [ #  # ]:          0 :             tg3_flag(tp, FLASH) &&
    3275                 :          0 :             !tg3_flag(tp, NO_NVRAM_ADDR_TRANS) &&
    3276         [ #  # ]:          0 :             (tp->nvram_jedecnum == JEDEC_ATMEL))
    3277                 :            : 
    3278                 :          0 :                 addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) *
    3279                 :          0 :                         tp->nvram_pagesize) +
    3280                 :          0 :                        (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1));
    3281                 :            : 
    3282                 :          0 :         return addr;
    3283                 :            : }
    3284                 :            : 
    3285                 :            : /* NOTE: Data read in from NVRAM is byteswapped according to
    3286                 :            :  * the byteswapping settings for all other register accesses.
    3287                 :            :  * tg3 devices are BE devices, so on a BE machine, the data
    3288                 :            :  * returned will be exactly as it is seen in NVRAM.  On a LE
    3289                 :            :  * machine, the 32-bit value will be byteswapped.
    3290                 :            :  */
    3291                 :          0 : static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
    3292                 :            : {
    3293                 :          0 :         int ret;
    3294                 :            : 
    3295         [ #  # ]:          0 :         if (!tg3_flag(tp, NVRAM))
    3296                 :          0 :                 return tg3_nvram_read_using_eeprom(tp, offset, val);
    3297                 :            : 
    3298                 :          0 :         offset = tg3_nvram_phys_addr(tp, offset);
    3299                 :            : 
    3300         [ #  # ]:          0 :         if (offset > NVRAM_ADDR_MSK)
    3301                 :            :                 return -EINVAL;
    3302                 :            : 
    3303                 :          0 :         ret = tg3_nvram_lock(tp);
    3304         [ #  # ]:          0 :         if (ret)
    3305                 :            :                 return ret;
    3306                 :            : 
    3307                 :          0 :         tg3_enable_nvram_access(tp);
    3308                 :            : 
    3309                 :          0 :         tw32(NVRAM_ADDR, offset);
    3310                 :          0 :         ret = tg3_nvram_exec_cmd(tp, NVRAM_CMD_RD | NVRAM_CMD_GO |
    3311                 :            :                 NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
    3312                 :            : 
    3313         [ #  # ]:          0 :         if (ret == 0)
    3314                 :          0 :                 *val = tr32(NVRAM_RDDATA);
    3315                 :            : 
    3316                 :          0 :         tg3_disable_nvram_access(tp);
    3317                 :            : 
    3318                 :          0 :         tg3_nvram_unlock(tp);
    3319                 :            : 
    3320                 :          0 :         return ret;
    3321                 :            : }
    3322                 :            : 
    3323                 :            : /* Ensures NVRAM data is in bytestream format. */
    3324                 :          0 : static int tg3_nvram_read_be32(struct tg3 *tp, u32 offset, __be32 *val)
    3325                 :            : {
    3326                 :          0 :         u32 v;
    3327                 :          0 :         int res = tg3_nvram_read(tp, offset, &v);
    3328   [ #  #  #  #  :          0 :         if (!res)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    3329                 :          0 :                 *val = cpu_to_be32(v);
    3330                 :          0 :         return res;
    3331                 :            : }
    3332                 :            : 
    3333                 :          0 : static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
    3334                 :            :                                     u32 offset, u32 len, u8 *buf)
    3335                 :            : {
    3336                 :          0 :         int i, j, rc = 0;
    3337                 :          0 :         u32 val;
    3338                 :            : 
    3339         [ #  # ]:          0 :         for (i = 0; i < len; i += 4) {
    3340                 :          0 :                 u32 addr;
    3341                 :          0 :                 __be32 data;
    3342                 :            : 
    3343                 :          0 :                 addr = offset + i;
    3344                 :            : 
    3345                 :          0 :                 memcpy(&data, buf + i, 4);
    3346                 :            : 
    3347                 :            :                 /*
    3348                 :            :                  * The SEEPROM interface expects the data to always be opposite
    3349                 :            :                  * the native endian format.  We accomplish this by reversing
    3350                 :            :                  * all the operations that would have been performed on the
    3351                 :            :                  * data from a call to tg3_nvram_read_be32().
    3352                 :            :                  */
    3353                 :          0 :                 tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data)));
    3354                 :            : 
    3355                 :          0 :                 val = tr32(GRC_EEPROM_ADDR);
    3356                 :          0 :                 tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
    3357                 :            : 
    3358                 :          0 :                 val &= ~(EEPROM_ADDR_ADDR_MASK | EEPROM_ADDR_DEVID_MASK |
    3359                 :            :                         EEPROM_ADDR_READ);
    3360                 :          0 :                 tw32(GRC_EEPROM_ADDR, val |
    3361                 :            :                         (0 << EEPROM_ADDR_DEVID_SHIFT) |
    3362                 :            :                         (addr & EEPROM_ADDR_ADDR_MASK) |
    3363                 :            :                         EEPROM_ADDR_START |
    3364                 :            :                         EEPROM_ADDR_WRITE);
    3365                 :            : 
    3366         [ #  # ]:          0 :                 for (j = 0; j < 1000; j++) {
    3367                 :          0 :                         val = tr32(GRC_EEPROM_ADDR);
    3368                 :            : 
    3369         [ #  # ]:          0 :                         if (val & EEPROM_ADDR_COMPLETE)
    3370                 :            :                                 break;
    3371                 :          0 :                         msleep(1);
    3372                 :            :                 }
    3373         [ #  # ]:          0 :                 if (!(val & EEPROM_ADDR_COMPLETE)) {
    3374                 :            :                         rc = -EBUSY;
    3375                 :            :                         break;
    3376                 :            :                 }
    3377                 :            :         }
    3378                 :            : 
    3379                 :          0 :         return rc;
    3380                 :            : }
    3381                 :            : 
    3382                 :            : /* offset and length are dword aligned */
    3383                 :          0 : static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
    3384                 :            :                 u8 *buf)
    3385                 :            : {
    3386                 :          0 :         int ret = 0;
    3387                 :          0 :         u32 pagesize = tp->nvram_pagesize;
    3388                 :          0 :         u32 pagemask = pagesize - 1;
    3389                 :          0 :         u32 nvram_cmd;
    3390                 :          0 :         u8 *tmp;
    3391                 :            : 
    3392         [ #  # ]:          0 :         tmp = kmalloc(pagesize, GFP_KERNEL);
    3393         [ #  # ]:          0 :         if (tmp == NULL)
    3394                 :            :                 return -ENOMEM;
    3395                 :            : 
    3396         [ #  # ]:          0 :         while (len) {
    3397                 :          0 :                 int j;
    3398                 :          0 :                 u32 phy_addr, page_off, size;
    3399                 :            : 
    3400                 :          0 :                 phy_addr = offset & ~pagemask;
    3401                 :            : 
    3402         [ #  # ]:          0 :                 for (j = 0; j < pagesize; j += 4) {
    3403                 :          0 :                         ret = tg3_nvram_read_be32(tp, phy_addr + j,
    3404                 :          0 :                                                   (__be32 *) (tmp + j));
    3405         [ #  # ]:          0 :                         if (ret)
    3406                 :            :                                 break;
    3407                 :            :                 }
    3408         [ #  # ]:          0 :                 if (ret)
    3409                 :            :                         break;
    3410                 :            : 
    3411                 :          0 :                 page_off = offset & pagemask;
    3412                 :          0 :                 size = pagesize;
    3413                 :          0 :                 if (len < size)
    3414                 :            :                         size = len;
    3415                 :            : 
    3416                 :          0 :                 len -= size;
    3417                 :            : 
    3418                 :          0 :                 memcpy(tmp + page_off, buf, size);
    3419                 :            : 
    3420                 :          0 :                 offset = offset + (pagesize - page_off);
    3421                 :            : 
    3422                 :          0 :                 tg3_enable_nvram_access(tp);
    3423                 :            : 
    3424                 :            :                 /*
    3425                 :            :                  * Before we can erase the flash page, we need
    3426                 :            :                  * to issue a special "write enable" command.
    3427                 :            :                  */
    3428                 :          0 :                 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
    3429                 :            : 
    3430         [ #  # ]:          0 :                 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
    3431                 :            :                         break;
    3432                 :            : 
    3433                 :            :                 /* Erase the target page */
    3434                 :          0 :                 tw32(NVRAM_ADDR, phy_addr);
    3435                 :            : 
    3436                 :          0 :                 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR |
    3437                 :            :                         NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_ERASE;
    3438                 :            : 
    3439         [ #  # ]:          0 :                 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
    3440                 :            :                         break;
    3441                 :            : 
    3442                 :            :                 /* Issue another write enable to start the write. */
    3443                 :          0 :                 nvram_cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
    3444                 :            : 
    3445         [ #  # ]:          0 :                 if (tg3_nvram_exec_cmd(tp, nvram_cmd))
    3446                 :            :                         break;
    3447                 :            : 
    3448         [ #  # ]:          0 :                 for (j = 0; j < pagesize; j += 4) {
    3449                 :          0 :                         __be32 data;
    3450                 :            : 
    3451                 :          0 :                         data = *((__be32 *) (tmp + j));
    3452                 :            : 
    3453                 :          0 :                         tw32(NVRAM_WRDATA, be32_to_cpu(data));
    3454                 :            : 
    3455                 :          0 :                         tw32(NVRAM_ADDR, phy_addr + j);
    3456                 :            : 
    3457                 :          0 :                         nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE |
    3458                 :            :                                 NVRAM_CMD_WR;
    3459                 :            : 
    3460         [ #  # ]:          0 :                         if (j == 0)
    3461                 :            :                                 nvram_cmd |= NVRAM_CMD_FIRST;
    3462         [ #  # ]:          0 :                         else if (j == (pagesize - 4))
    3463                 :          0 :                                 nvram_cmd |= NVRAM_CMD_LAST;
    3464                 :            : 
    3465                 :          0 :                         ret = tg3_nvram_exec_cmd(tp, nvram_cmd);
    3466         [ #  # ]:          0 :                         if (ret)
    3467                 :            :                                 break;
    3468                 :            :                 }
    3469         [ #  # ]:          0 :                 if (ret)
    3470                 :            :                         break;
    3471                 :            :         }
    3472                 :            : 
    3473                 :          0 :         nvram_cmd = NVRAM_CMD_WRDI | NVRAM_CMD_GO | NVRAM_CMD_DONE;
    3474                 :          0 :         tg3_nvram_exec_cmd(tp, nvram_cmd);
    3475                 :            : 
    3476                 :          0 :         kfree(tmp);
    3477                 :            : 
    3478                 :          0 :         return ret;
    3479                 :            : }
    3480                 :            : 
    3481                 :            : /* offset and length are dword aligned */
    3482                 :          0 : static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
    3483                 :            :                 u8 *buf)
    3484                 :            : {
    3485                 :          0 :         int i, ret = 0;
    3486                 :            : 
    3487         [ #  # ]:          0 :         for (i = 0; i < len; i += 4, offset += 4) {
    3488                 :          0 :                 u32 page_off, phy_addr, nvram_cmd;
    3489                 :          0 :                 __be32 data;
    3490                 :            : 
    3491                 :          0 :                 memcpy(&data, buf + i, 4);
    3492                 :          0 :                 tw32(NVRAM_WRDATA, be32_to_cpu(data));
    3493                 :            : 
    3494                 :          0 :                 page_off = offset % tp->nvram_pagesize;
    3495                 :            : 
    3496                 :          0 :                 phy_addr = tg3_nvram_phys_addr(tp, offset);
    3497                 :            : 
    3498                 :          0 :                 nvram_cmd = NVRAM_CMD_GO | NVRAM_CMD_DONE | NVRAM_CMD_WR;
    3499                 :            : 
    3500         [ #  # ]:          0 :                 if (page_off == 0 || i == 0)
    3501                 :          0 :                         nvram_cmd |= NVRAM_CMD_FIRST;
    3502         [ #  # ]:          0 :                 if (page_off == (tp->nvram_pagesize - 4))
    3503                 :          0 :                         nvram_cmd |= NVRAM_CMD_LAST;
    3504                 :            : 
    3505         [ #  # ]:          0 :                 if (i == (len - 4))
    3506                 :          0 :                         nvram_cmd |= NVRAM_CMD_LAST;
    3507                 :            : 
    3508   [ #  #  #  # ]:          0 :                 if ((nvram_cmd & NVRAM_CMD_FIRST) ||
    3509         [ #  # ]:          0 :                     !tg3_flag(tp, FLASH) ||
    3510                 :            :                     !tg3_flag(tp, 57765_PLUS))
    3511                 :          0 :                         tw32(NVRAM_ADDR, phy_addr);
    3512                 :            : 
    3513   [ #  #  #  # ]:          0 :                 if (tg3_asic_rev(tp) != ASIC_REV_5752 &&
    3514                 :          0 :                     !tg3_flag(tp, 5755_PLUS) &&
    3515   [ #  #  #  # ]:          0 :                     (tp->nvram_jedecnum == JEDEC_ST) &&
    3516                 :            :                     (nvram_cmd & NVRAM_CMD_FIRST)) {
    3517                 :          0 :                         u32 cmd;
    3518                 :            : 
    3519                 :          0 :                         cmd = NVRAM_CMD_WREN | NVRAM_CMD_GO | NVRAM_CMD_DONE;
    3520                 :          0 :                         ret = tg3_nvram_exec_cmd(tp, cmd);
    3521         [ #  # ]:          0 :                         if (ret)
    3522                 :            :                                 break;
    3523                 :            :                 }
    3524         [ #  # ]:          0 :                 if (!tg3_flag(tp, FLASH)) {
    3525                 :            :                         /* We always do complete word writes to eeprom. */
    3526                 :          0 :                         nvram_cmd |= (NVRAM_CMD_FIRST | NVRAM_CMD_LAST);
    3527                 :            :                 }
    3528                 :            : 
    3529                 :          0 :                 ret = tg3_nvram_exec_cmd(tp, nvram_cmd);
    3530         [ #  # ]:          0 :                 if (ret)
    3531                 :            :                         break;
    3532                 :            :         }
    3533                 :          0 :         return ret;
    3534                 :            : }
    3535                 :            : 
    3536                 :            : /* offset and length are dword aligned */
    3537                 :          0 : static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
    3538                 :            : {
    3539                 :          0 :         int ret;
    3540                 :            : 
    3541         [ #  # ]:          0 :         if (tg3_flag(tp, EEPROM_WRITE_PROT)) {
    3542                 :          0 :                 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
    3543                 :            :                        ~GRC_LCLCTRL_GPIO_OUTPUT1);
    3544                 :          0 :                 udelay(40);
    3545                 :            :         }
    3546                 :            : 
    3547         [ #  # ]:          0 :         if (!tg3_flag(tp, NVRAM)) {
    3548                 :          0 :                 ret = tg3_nvram_write_block_using_eeprom(tp, offset, len, buf);
    3549                 :            :         } else {
    3550                 :          0 :                 u32 grc_mode;
    3551                 :            : 
    3552                 :          0 :                 ret = tg3_nvram_lock(tp);
    3553         [ #  # ]:          0 :                 if (ret)
    3554                 :            :                         return ret;
    3555                 :            : 
    3556                 :          0 :                 tg3_enable_nvram_access(tp);
    3557   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, 5750_PLUS) && !tg3_flag(tp, PROTECTED_NVRAM))
    3558                 :          0 :                         tw32(NVRAM_WRITE1, 0x406);
    3559                 :            : 
    3560                 :          0 :                 grc_mode = tr32(GRC_MODE);
    3561                 :          0 :                 tw32(GRC_MODE, grc_mode | GRC_MODE_NVRAM_WR_ENABLE);
    3562                 :            : 
    3563   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, NVRAM_BUFFERED) || !tg3_flag(tp, FLASH)) {
    3564                 :          0 :                         ret = tg3_nvram_write_block_buffered(tp, offset, len,
    3565                 :            :                                 buf);
    3566                 :            :                 } else {
    3567                 :          0 :                         ret = tg3_nvram_write_block_unbuffered(tp, offset, len,
    3568                 :            :                                 buf);
    3569                 :            :                 }
    3570                 :            : 
    3571                 :          0 :                 grc_mode = tr32(GRC_MODE);
    3572                 :          0 :                 tw32(GRC_MODE, grc_mode & ~GRC_MODE_NVRAM_WR_ENABLE);
    3573                 :            : 
    3574                 :          0 :                 tg3_disable_nvram_access(tp);
    3575                 :          0 :                 tg3_nvram_unlock(tp);
    3576                 :            :         }
    3577                 :            : 
    3578         [ #  # ]:          0 :         if (tg3_flag(tp, EEPROM_WRITE_PROT)) {
    3579                 :          0 :                 tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
    3580                 :          0 :                 udelay(40);
    3581                 :            :         }
    3582                 :            : 
    3583                 :            :         return ret;
    3584                 :            : }
    3585                 :            : 
    3586                 :            : #define RX_CPU_SCRATCH_BASE     0x30000
    3587                 :            : #define RX_CPU_SCRATCH_SIZE     0x04000
    3588                 :            : #define TX_CPU_SCRATCH_BASE     0x34000
    3589                 :            : #define TX_CPU_SCRATCH_SIZE     0x04000
    3590                 :            : 
    3591                 :            : /* tp->lock is held. */
    3592                 :          0 : static int tg3_pause_cpu(struct tg3 *tp, u32 cpu_base)
    3593                 :            : {
    3594                 :          0 :         int i;
    3595                 :          0 :         const int iters = 10000;
    3596                 :            : 
    3597         [ #  # ]:          0 :         for (i = 0; i < iters; i++) {
    3598                 :          0 :                 tw32(cpu_base + CPU_STATE, 0xffffffff);
    3599                 :          0 :                 tw32(cpu_base + CPU_MODE,  CPU_MODE_HALT);
    3600         [ #  # ]:          0 :                 if (tr32(cpu_base + CPU_MODE) & CPU_MODE_HALT)
    3601                 :            :                         break;
    3602         [ #  # ]:          0 :                 if (pci_channel_offline(tp->pdev))
    3603                 :            :                         return -EBUSY;
    3604                 :            :         }
    3605                 :            : 
    3606         [ #  # ]:          0 :         return (i == iters) ? -EBUSY : 0;
    3607                 :            : }
    3608                 :            : 
    3609                 :            : /* tp->lock is held. */
    3610                 :          0 : static int tg3_rxcpu_pause(struct tg3 *tp)
    3611                 :            : {
    3612                 :          0 :         int rc = tg3_pause_cpu(tp, RX_CPU_BASE);
    3613                 :            : 
    3614                 :          0 :         tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
    3615                 :          0 :         tw32_f(RX_CPU_BASE + CPU_MODE,  CPU_MODE_HALT);
    3616                 :          0 :         udelay(10);
    3617                 :            : 
    3618                 :          0 :         return rc;
    3619                 :            : }
    3620                 :            : 
    3621                 :            : /* tp->lock is held. */
    3622                 :          0 : static int tg3_txcpu_pause(struct tg3 *tp)
    3623                 :            : {
    3624                 :          0 :         return tg3_pause_cpu(tp, TX_CPU_BASE);
    3625                 :            : }
    3626                 :            : 
    3627                 :            : /* tp->lock is held. */
    3628                 :          0 : static void tg3_resume_cpu(struct tg3 *tp, u32 cpu_base)
    3629                 :            : {
    3630                 :          0 :         tw32(cpu_base + CPU_STATE, 0xffffffff);
    3631                 :          0 :         tw32_f(cpu_base + CPU_MODE,  0x00000000);
    3632                 :          0 : }
    3633                 :            : 
    3634                 :            : /* tp->lock is held. */
    3635                 :          0 : static void tg3_rxcpu_resume(struct tg3 *tp)
    3636                 :            : {
    3637                 :          0 :         tg3_resume_cpu(tp, RX_CPU_BASE);
    3638                 :          0 : }
    3639                 :            : 
    3640                 :            : /* tp->lock is held. */
    3641                 :          0 : static int tg3_halt_cpu(struct tg3 *tp, u32 cpu_base)
    3642                 :            : {
    3643                 :          0 :         int rc;
    3644                 :            : 
    3645   [ #  #  #  # ]:          0 :         BUG_ON(cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS));
    3646                 :            : 
    3647         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    3648                 :          0 :                 u32 val = tr32(GRC_VCPU_EXT_CTRL);
    3649                 :            : 
    3650                 :          0 :                 tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU);
    3651                 :          0 :                 return 0;
    3652                 :            :         }
    3653         [ #  # ]:          0 :         if (cpu_base == RX_CPU_BASE) {
    3654                 :          0 :                 rc = tg3_rxcpu_pause(tp);
    3655                 :            :         } else {
    3656                 :            :                 /*
    3657                 :            :                  * There is only an Rx CPU for the 5750 derivative in the
    3658                 :            :                  * BCM4785.
    3659                 :            :                  */
    3660         [ #  # ]:          0 :                 if (tg3_flag(tp, IS_SSB_CORE))
    3661                 :            :                         return 0;
    3662                 :            : 
    3663                 :          0 :                 rc = tg3_txcpu_pause(tp);
    3664                 :            :         }
    3665                 :            : 
    3666         [ #  # ]:          0 :         if (rc) {
    3667         [ #  # ]:          0 :                 netdev_err(tp->dev, "%s timed out, %s CPU\n",
    3668                 :            :                            __func__, cpu_base == RX_CPU_BASE ? "RX" : "TX");
    3669                 :          0 :                 return -ENODEV;
    3670                 :            :         }
    3671                 :            : 
    3672                 :            :         /* Clear firmware's nvram arbitration. */
    3673         [ #  # ]:          0 :         if (tg3_flag(tp, NVRAM))
    3674                 :          0 :                 tw32(NVRAM_SWARB, SWARB_REQ_CLR0);
    3675                 :            :         return 0;
    3676                 :            : }
    3677                 :            : 
    3678                 :          0 : static int tg3_fw_data_len(struct tg3 *tp,
    3679                 :            :                            const struct tg3_firmware_hdr *fw_hdr)
    3680                 :            : {
    3681                 :          0 :         int fw_len;
    3682                 :            : 
    3683                 :            :         /* Non fragmented firmware have one firmware header followed by a
    3684                 :            :          * contiguous chunk of data to be written. The length field in that
    3685                 :            :          * header is not the length of data to be written but the complete
    3686                 :            :          * length of the bss. The data length is determined based on
    3687                 :            :          * tp->fw->size minus headers.
    3688                 :            :          *
    3689                 :            :          * Fragmented firmware have a main header followed by multiple
    3690                 :            :          * fragments. Each fragment is identical to non fragmented firmware
    3691                 :            :          * with a firmware header followed by a contiguous chunk of data. In
    3692                 :            :          * the main header, the length field is unused and set to 0xffffffff.
    3693                 :            :          * In each fragment header the length is the entire size of that
    3694                 :            :          * fragment i.e. fragment data + header length. Data length is
    3695                 :            :          * therefore length field in the header minus TG3_FW_HDR_LEN.
    3696                 :            :          */
    3697                 :          0 :         if (tp->fw_len == 0xffffffff)
    3698                 :          0 :                 fw_len = be32_to_cpu(fw_hdr->len);
    3699                 :            :         else
    3700                 :          0 :                 fw_len = tp->fw->size;
    3701                 :            : 
    3702                 :          0 :         return (fw_len - TG3_FW_HDR_LEN) / sizeof(u32);
    3703                 :            : }
    3704                 :            : 
    3705                 :            : /* tp->lock is held. */
    3706                 :          0 : static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base,
    3707                 :            :                                  u32 cpu_scratch_base, int cpu_scratch_size,
    3708                 :            :                                  const struct tg3_firmware_hdr *fw_hdr)
    3709                 :            : {
    3710                 :          0 :         int err, i;
    3711                 :          0 :         void (*write_op)(struct tg3 *, u32, u32);
    3712                 :          0 :         int total_len = tp->fw->size;
    3713                 :            : 
    3714   [ #  #  #  # ]:          0 :         if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) {
    3715                 :          0 :                 netdev_err(tp->dev,
    3716                 :            :                            "%s: Trying to load TX cpu firmware which is 5705\n",
    3717                 :            :                            __func__);
    3718                 :          0 :                 return -EINVAL;
    3719                 :            :         }
    3720                 :            : 
    3721   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS) && tg3_asic_rev(tp) != ASIC_REV_57766)
    3722                 :            :                 write_op = tg3_write_mem;
    3723                 :            :         else
    3724                 :          0 :                 write_op = tg3_write_indirect_reg32;
    3725                 :            : 
    3726         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_57766) {
    3727                 :            :                 /* It is possible that bootcode is still loading at this point.
    3728                 :            :                  * Get the nvram lock first before halting the cpu.
    3729                 :            :                  */
    3730                 :          0 :                 int lock_err = tg3_nvram_lock(tp);
    3731                 :          0 :                 err = tg3_halt_cpu(tp, cpu_base);
    3732         [ #  # ]:          0 :                 if (!lock_err)
    3733                 :          0 :                         tg3_nvram_unlock(tp);
    3734         [ #  # ]:          0 :                 if (err)
    3735                 :          0 :                         goto out;
    3736                 :            : 
    3737         [ #  # ]:          0 :                 for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
    3738                 :          0 :                         write_op(tp, cpu_scratch_base + i, 0);
    3739                 :          0 :                 tw32(cpu_base + CPU_STATE, 0xffffffff);
    3740                 :          0 :                 tw32(cpu_base + CPU_MODE,
    3741                 :            :                      tr32(cpu_base + CPU_MODE) | CPU_MODE_HALT);
    3742                 :            :         } else {
    3743                 :            :                 /* Subtract additional main header for fragmented firmware and
    3744                 :            :                  * advance to the first fragment
    3745                 :            :                  */
    3746                 :          0 :                 total_len -= TG3_FW_HDR_LEN;
    3747                 :          0 :                 fw_hdr++;
    3748                 :            :         }
    3749                 :            : 
    3750                 :          0 :         do {
    3751                 :          0 :                 u32 *fw_data = (u32 *)(fw_hdr + 1);
    3752   [ #  #  #  # ]:          0 :                 for (i = 0; i < tg3_fw_data_len(tp, fw_hdr); i++)
    3753                 :          0 :                         write_op(tp, cpu_scratch_base +
    3754                 :          0 :                                      (be32_to_cpu(fw_hdr->base_addr) & 0xffff) +
    3755                 :            :                                      (i * sizeof(u32)),
    3756                 :          0 :                                  be32_to_cpu(fw_data[i]));
    3757                 :            : 
    3758                 :          0 :                 total_len -= be32_to_cpu(fw_hdr->len);
    3759                 :            : 
    3760                 :            :                 /* Advance to next fragment */
    3761                 :          0 :                 fw_hdr = (struct tg3_firmware_hdr *)
    3762                 :          0 :                          ((void *)fw_hdr + be32_to_cpu(fw_hdr->len));
    3763         [ #  # ]:          0 :         } while (total_len > 0);
    3764                 :            : 
    3765                 :            :         err = 0;
    3766                 :            : 
    3767                 :            : out:
    3768                 :            :         return err;
    3769                 :            : }
    3770                 :            : 
    3771                 :            : /* tp->lock is held. */
    3772                 :          0 : static int tg3_pause_cpu_and_set_pc(struct tg3 *tp, u32 cpu_base, u32 pc)
    3773                 :            : {
    3774                 :          0 :         int i;
    3775                 :          0 :         const int iters = 5;
    3776                 :            : 
    3777                 :          0 :         tw32(cpu_base + CPU_STATE, 0xffffffff);
    3778                 :          0 :         tw32_f(cpu_base + CPU_PC, pc);
    3779                 :            : 
    3780         [ #  # ]:          0 :         for (i = 0; i < iters; i++) {
    3781         [ #  # ]:          0 :                 if (tr32(cpu_base + CPU_PC) == pc)
    3782                 :            :                         break;
    3783                 :          0 :                 tw32(cpu_base + CPU_STATE, 0xffffffff);
    3784                 :          0 :                 tw32(cpu_base + CPU_MODE,  CPU_MODE_HALT);
    3785                 :          0 :                 tw32_f(cpu_base + CPU_PC, pc);
    3786                 :          0 :                 udelay(1000);
    3787                 :            :         }
    3788                 :            : 
    3789         [ #  # ]:          0 :         return (i == iters) ? -EBUSY : 0;
    3790                 :            : }
    3791                 :            : 
    3792                 :            : /* tp->lock is held. */
    3793                 :          0 : static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
    3794                 :            : {
    3795                 :          0 :         const struct tg3_firmware_hdr *fw_hdr;
    3796                 :          0 :         int err;
    3797                 :            : 
    3798                 :          0 :         fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
    3799                 :            : 
    3800                 :            :         /* Firmware blob starts with version numbers, followed by
    3801                 :            :            start address and length. We are setting complete length.
    3802                 :            :            length = end_address_of_bss - start_address_of_text.
    3803                 :            :            Remainder is the blob to be loaded contiguously
    3804                 :            :            from start address. */
    3805                 :            : 
    3806                 :          0 :         err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
    3807                 :            :                                     RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
    3808                 :            :                                     fw_hdr);
    3809         [ #  # ]:          0 :         if (err)
    3810                 :            :                 return err;
    3811                 :            : 
    3812                 :          0 :         err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
    3813                 :            :                                     TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
    3814                 :            :                                     fw_hdr);
    3815         [ #  # ]:          0 :         if (err)
    3816                 :            :                 return err;
    3817                 :            : 
    3818                 :            :         /* Now startup only the RX cpu. */
    3819                 :          0 :         err = tg3_pause_cpu_and_set_pc(tp, RX_CPU_BASE,
    3820                 :          0 :                                        be32_to_cpu(fw_hdr->base_addr));
    3821         [ #  # ]:          0 :         if (err) {
    3822                 :          0 :                 netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x "
    3823                 :            :                            "should be %08x\n", __func__,
    3824                 :          0 :                            tr32(RX_CPU_BASE + CPU_PC),
    3825                 :          0 :                                 be32_to_cpu(fw_hdr->base_addr));
    3826                 :          0 :                 return -ENODEV;
    3827                 :            :         }
    3828                 :            : 
    3829                 :          0 :         tg3_rxcpu_resume(tp);
    3830                 :            : 
    3831                 :          0 :         return 0;
    3832                 :            : }
    3833                 :            : 
    3834                 :          0 : static int tg3_validate_rxcpu_state(struct tg3 *tp)
    3835                 :            : {
    3836                 :          0 :         const int iters = 1000;
    3837                 :          0 :         int i;
    3838                 :          0 :         u32 val;
    3839                 :            : 
    3840                 :            :         /* Wait for boot code to complete initialization and enter service
    3841                 :            :          * loop. It is then safe to download service patches
    3842                 :            :          */
    3843         [ #  # ]:          0 :         for (i = 0; i < iters; i++) {
    3844         [ #  # ]:          0 :                 if (tr32(RX_CPU_HWBKPT) == TG3_SBROM_IN_SERVICE_LOOP)
    3845                 :            :                         break;
    3846                 :            : 
    3847                 :          0 :                 udelay(10);
    3848                 :            :         }
    3849                 :            : 
    3850         [ #  # ]:          0 :         if (i == iters) {
    3851                 :          0 :                 netdev_err(tp->dev, "Boot code not ready for service patches\n");
    3852                 :          0 :                 return -EBUSY;
    3853                 :            :         }
    3854                 :            : 
    3855                 :          0 :         val = tg3_read_indirect_reg32(tp, TG3_57766_FW_HANDSHAKE);
    3856         [ #  # ]:          0 :         if (val & 0xff) {
    3857                 :          0 :                 netdev_warn(tp->dev,
    3858                 :            :                             "Other patches exist. Not downloading EEE patch\n");
    3859                 :          0 :                 return -EEXIST;
    3860                 :            :         }
    3861                 :            : 
    3862                 :            :         return 0;
    3863                 :            : }
    3864                 :            : 
    3865                 :            : /* tp->lock is held. */
    3866                 :          0 : static void tg3_load_57766_firmware(struct tg3 *tp)
    3867                 :            : {
    3868                 :          0 :         struct tg3_firmware_hdr *fw_hdr;
    3869                 :            : 
    3870         [ #  # ]:          0 :         if (!tg3_flag(tp, NO_NVRAM))
    3871                 :            :                 return;
    3872                 :            : 
    3873         [ #  # ]:          0 :         if (tg3_validate_rxcpu_state(tp))
    3874                 :            :                 return;
    3875                 :            : 
    3876         [ #  # ]:          0 :         if (!tp->fw)
    3877                 :            :                 return;
    3878                 :            : 
    3879                 :            :         /* This firmware blob has a different format than older firmware
    3880                 :            :          * releases as given below. The main difference is we have fragmented
    3881                 :            :          * data to be written to non-contiguous locations.
    3882                 :            :          *
    3883                 :            :          * In the beginning we have a firmware header identical to other
    3884                 :            :          * firmware which consists of version, base addr and length. The length
    3885                 :            :          * here is unused and set to 0xffffffff.
    3886                 :            :          *
    3887                 :            :          * This is followed by a series of firmware fragments which are
    3888                 :            :          * individually identical to previous firmware. i.e. they have the
    3889                 :            :          * firmware header and followed by data for that fragment. The version
    3890                 :            :          * field of the individual fragment header is unused.
    3891                 :            :          */
    3892                 :            : 
    3893                 :          0 :         fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
    3894         [ #  # ]:          0 :         if (be32_to_cpu(fw_hdr->base_addr) != TG3_57766_FW_BASE_ADDR)
    3895                 :            :                 return;
    3896                 :            : 
    3897         [ #  # ]:          0 :         if (tg3_rxcpu_pause(tp))
    3898                 :            :                 return;
    3899                 :            : 
    3900                 :            :         /* tg3_load_firmware_cpu() will always succeed for the 57766 */
    3901                 :          0 :         tg3_load_firmware_cpu(tp, 0, TG3_57766_FW_BASE_ADDR, 0, fw_hdr);
    3902                 :            : 
    3903                 :          0 :         tg3_rxcpu_resume(tp);
    3904                 :            : }
    3905                 :            : 
    3906                 :            : /* tp->lock is held. */
    3907                 :          0 : static int tg3_load_tso_firmware(struct tg3 *tp)
    3908                 :            : {
    3909                 :          0 :         const struct tg3_firmware_hdr *fw_hdr;
    3910                 :          0 :         unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
    3911                 :          0 :         int err;
    3912                 :            : 
    3913         [ #  # ]:          0 :         if (!tg3_flag(tp, FW_TSO))
    3914                 :            :                 return 0;
    3915                 :            : 
    3916                 :          0 :         fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
    3917                 :            : 
    3918                 :            :         /* Firmware blob starts with version numbers, followed by
    3919                 :            :            start address and length. We are setting complete length.
    3920                 :            :            length = end_address_of_bss - start_address_of_text.
    3921                 :            :            Remainder is the blob to be loaded contiguously
    3922                 :            :            from start address. */
    3923                 :            : 
    3924                 :          0 :         cpu_scratch_size = tp->fw_len;
    3925                 :            : 
    3926         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5705) {
    3927                 :            :                 cpu_base = RX_CPU_BASE;
    3928                 :            :                 cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705;
    3929                 :            :         } else {
    3930                 :          0 :                 cpu_base = TX_CPU_BASE;
    3931                 :          0 :                 cpu_scratch_base = TX_CPU_SCRATCH_BASE;
    3932                 :          0 :                 cpu_scratch_size = TX_CPU_SCRATCH_SIZE;
    3933                 :            :         }
    3934                 :            : 
    3935                 :          0 :         err = tg3_load_firmware_cpu(tp, cpu_base,
    3936                 :            :                                     cpu_scratch_base, cpu_scratch_size,
    3937                 :            :                                     fw_hdr);
    3938         [ #  # ]:          0 :         if (err)
    3939                 :            :                 return err;
    3940                 :            : 
    3941                 :            :         /* Now startup the cpu. */
    3942                 :          0 :         err = tg3_pause_cpu_and_set_pc(tp, cpu_base,
    3943                 :          0 :                                        be32_to_cpu(fw_hdr->base_addr));
    3944         [ #  # ]:          0 :         if (err) {
    3945                 :          0 :                 netdev_err(tp->dev,
    3946                 :            :                            "%s fails to set CPU PC, is %08x should be %08x\n",
    3947                 :          0 :                            __func__, tr32(cpu_base + CPU_PC),
    3948                 :          0 :                            be32_to_cpu(fw_hdr->base_addr));
    3949                 :          0 :                 return -ENODEV;
    3950                 :            :         }
    3951                 :            : 
    3952                 :          0 :         tg3_resume_cpu(tp, cpu_base);
    3953                 :          0 :         return 0;
    3954                 :            : }
    3955                 :            : 
    3956                 :            : /* tp->lock is held. */
    3957                 :          0 : static void __tg3_set_one_mac_addr(struct tg3 *tp, u8 *mac_addr, int index)
    3958                 :            : {
    3959                 :          0 :         u32 addr_high, addr_low;
    3960                 :            : 
    3961                 :          0 :         addr_high = ((mac_addr[0] << 8) | mac_addr[1]);
    3962                 :          0 :         addr_low = ((mac_addr[2] << 24) | (mac_addr[3] << 16) |
    3963                 :          0 :                     (mac_addr[4] <<  8) | mac_addr[5]);
    3964                 :            : 
    3965         [ #  # ]:          0 :         if (index < 4) {
    3966                 :          0 :                 tw32(MAC_ADDR_0_HIGH + (index * 8), addr_high);
    3967                 :          0 :                 tw32(MAC_ADDR_0_LOW + (index * 8), addr_low);
    3968                 :            :         } else {
    3969                 :          0 :                 index -= 4;
    3970                 :          0 :                 tw32(MAC_EXTADDR_0_HIGH + (index * 8), addr_high);
    3971                 :          0 :                 tw32(MAC_EXTADDR_0_LOW + (index * 8), addr_low);
    3972                 :            :         }
    3973                 :          0 : }
    3974                 :            : 
    3975                 :            : /* tp->lock is held. */
    3976                 :          0 : static void __tg3_set_mac_addr(struct tg3 *tp, bool skip_mac_1)
    3977                 :            : {
    3978                 :          0 :         u32 addr_high;
    3979                 :          0 :         int i;
    3980                 :            : 
    3981         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
    3982         [ #  # ]:          0 :                 if (i == 1 && skip_mac_1)
    3983                 :          0 :                         continue;
    3984                 :          0 :                 __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i);
    3985                 :            :         }
    3986                 :            : 
    3987         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5703 ||
    3988                 :            :             tg3_asic_rev(tp) == ASIC_REV_5704) {
    3989         [ #  # ]:          0 :                 for (i = 4; i < 16; i++)
    3990                 :          0 :                         __tg3_set_one_mac_addr(tp, tp->dev->dev_addr, i);
    3991                 :            :         }
    3992                 :            : 
    3993                 :          0 :         addr_high = (tp->dev->dev_addr[0] +
    3994                 :          0 :                      tp->dev->dev_addr[1] +
    3995                 :          0 :                      tp->dev->dev_addr[2] +
    3996                 :          0 :                      tp->dev->dev_addr[3] +
    3997                 :          0 :                      tp->dev->dev_addr[4] +
    3998                 :          0 :                      tp->dev->dev_addr[5]) &
    3999                 :            :                 TX_BACKOFF_SEED_MASK;
    4000                 :          0 :         tw32(MAC_TX_BACKOFF_SEED, addr_high);
    4001                 :          0 : }
    4002                 :            : 
    4003                 :          0 : static void tg3_enable_register_access(struct tg3 *tp)
    4004                 :            : {
    4005                 :            :         /*
    4006                 :            :          * Make sure register accesses (indirect or otherwise) will function
    4007                 :            :          * correctly.
    4008                 :            :          */
    4009                 :          0 :         pci_write_config_dword(tp->pdev,
    4010                 :            :                                TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl);
    4011                 :            : }
    4012                 :            : 
    4013                 :          0 : static int tg3_power_up(struct tg3 *tp)
    4014                 :            : {
    4015                 :          0 :         int err;
    4016                 :            : 
    4017                 :          0 :         tg3_enable_register_access(tp);
    4018                 :            : 
    4019                 :          0 :         err = pci_set_power_state(tp->pdev, PCI_D0);
    4020         [ #  # ]:          0 :         if (!err) {
    4021                 :            :                 /* Switch out of Vaux if it is a NIC */
    4022                 :          0 :                 tg3_pwrsrc_switch_to_vmain(tp);
    4023                 :            :         } else {
    4024                 :          0 :                 netdev_err(tp->dev, "Transition to D0 failed\n");
    4025                 :            :         }
    4026                 :            : 
    4027                 :          0 :         return err;
    4028                 :            : }
    4029                 :            : 
    4030                 :            : static int tg3_setup_phy(struct tg3 *, bool);
    4031                 :            : 
    4032                 :          0 : static int tg3_power_down_prepare(struct tg3 *tp)
    4033                 :            : {
    4034                 :          0 :         u32 misc_host_ctrl;
    4035                 :          0 :         bool device_should_wake, do_low_power;
    4036                 :            : 
    4037                 :          0 :         tg3_enable_register_access(tp);
    4038                 :            : 
    4039                 :            :         /* Restore the CLKREQ setting. */
    4040         [ #  # ]:          0 :         if (tg3_flag(tp, CLKREQ_BUG))
    4041                 :          0 :                 pcie_capability_set_word(tp->pdev, PCI_EXP_LNKCTL,
    4042                 :            :                                          PCI_EXP_LNKCTL_CLKREQ_EN);
    4043                 :            : 
    4044                 :          0 :         misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
    4045                 :          0 :         tw32(TG3PCI_MISC_HOST_CTRL,
    4046                 :            :              misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT);
    4047                 :            : 
    4048   [ #  #  #  #  :          0 :         device_should_wake = device_may_wakeup(&tp->pdev->dev) &&
                   #  # ]
    4049                 :            :                              tg3_flag(tp, WOL_ENABLE);
    4050                 :            : 
    4051         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB)) {
    4052                 :          0 :                 do_low_power = false;
    4053         [ #  # ]:          0 :                 if ((tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) &&
    4054                 :            :                     !(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) {
    4055                 :          0 :                         __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising) = { 0, };
    4056                 :          0 :                         struct phy_device *phydev;
    4057                 :          0 :                         u32 phyid;
    4058                 :            : 
    4059                 :          0 :                         phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
    4060                 :            : 
    4061                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER;
    4062                 :            : 
    4063                 :          0 :                         tp->link_config.speed = phydev->speed;
    4064                 :          0 :                         tp->link_config.duplex = phydev->duplex;
    4065                 :          0 :                         tp->link_config.autoneg = phydev->autoneg;
    4066                 :          0 :                         ethtool_convert_link_mode_to_legacy_u32(
    4067                 :            :                                 &tp->link_config.advertising,
    4068                 :          0 :                                 phydev->advertising);
    4069                 :            : 
    4070                 :          0 :                         linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, advertising);
    4071                 :          0 :                         linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
    4072                 :            :                                          advertising);
    4073                 :          0 :                         linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
    4074                 :            :                                          advertising);
    4075                 :          0 :                         linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
    4076                 :            :                                          advertising);
    4077                 :            : 
    4078   [ #  #  #  # ]:          0 :                         if (tg3_flag(tp, ENABLE_ASF) || device_should_wake) {
    4079         [ #  # ]:          0 :                                 if (tg3_flag(tp, WOL_SPEED_100MB)) {
    4080                 :          0 :                                         linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
    4081                 :            :                                                          advertising);
    4082                 :          0 :                                         linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
    4083                 :            :                                                          advertising);
    4084                 :          0 :                                         linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
    4085                 :            :                                                          advertising);
    4086                 :            :                                 } else {
    4087                 :          0 :                                         linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
    4088                 :            :                                                          advertising);
    4089                 :            :                                 }
    4090                 :            :                         }
    4091                 :            : 
    4092                 :          0 :                         linkmode_copy(phydev->advertising, advertising);
    4093                 :          0 :                         phy_start_aneg(phydev);
    4094                 :            : 
    4095                 :          0 :                         phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask;
    4096         [ #  # ]:          0 :                         if (phyid != PHY_ID_BCMAC131) {
    4097                 :          0 :                                 phyid &= PHY_BCM_OUI_MASK;
    4098                 :          0 :                                 if (phyid == PHY_BCM_OUI_1 ||
    4099   [ #  #  #  # ]:          0 :                                     phyid == PHY_BCM_OUI_2 ||
    4100                 :            :                                     phyid == PHY_BCM_OUI_3)
    4101                 :          0 :                                         do_low_power = true;
    4102                 :            :                         }
    4103                 :            :                 }
    4104                 :            :         } else {
    4105                 :          0 :                 do_low_power = true;
    4106                 :            : 
    4107         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER))
    4108                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_IS_LOW_POWER;
    4109                 :            : 
    4110         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
    4111                 :          0 :                         tg3_setup_phy(tp, false);
    4112                 :            :         }
    4113                 :            : 
    4114         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    4115                 :          0 :                 u32 val;
    4116                 :            : 
    4117                 :          0 :                 val = tr32(GRC_VCPU_EXT_CTRL);
    4118                 :          0 :                 tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_DISABLE_WOL);
    4119         [ #  # ]:          0 :         } else if (!tg3_flag(tp, ENABLE_ASF)) {
    4120                 :            :                 int i;
    4121                 :            :                 u32 val;
    4122                 :            : 
    4123         [ #  # ]:          0 :                 for (i = 0; i < 200; i++) {
    4124                 :          0 :                         tg3_read_mem(tp, NIC_SRAM_FW_ASF_STATUS_MBOX, &val);
    4125         [ #  # ]:          0 :                         if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
    4126                 :            :                                 break;
    4127                 :          0 :                         msleep(1);
    4128                 :            :                 }
    4129                 :            :         }
    4130         [ #  # ]:          0 :         if (tg3_flag(tp, WOL_CAP))
    4131                 :          0 :                 tg3_write_mem(tp, NIC_SRAM_WOL_MBOX, WOL_SIGNATURE |
    4132                 :            :                                                      WOL_DRV_STATE_SHUTDOWN |
    4133                 :            :                                                      WOL_DRV_WOL |
    4134                 :            :                                                      WOL_SET_MAGIC_PKT);
    4135                 :            : 
    4136         [ #  # ]:          0 :         if (device_should_wake) {
    4137                 :          0 :                 u32 mac_mode;
    4138                 :            : 
    4139         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) {
    4140         [ #  # ]:          0 :                         if (do_low_power &&
    4141         [ #  # ]:          0 :                             !(tp->phy_flags & TG3_PHYFLG_IS_FET)) {
    4142                 :          0 :                                 tg3_phy_auxctl_write(tp,
    4143                 :            :                                                MII_TG3_AUXCTL_SHDWSEL_PWRCTL,
    4144                 :            :                                                MII_TG3_AUXCTL_PCTL_WOL_EN |
    4145                 :            :                                                MII_TG3_AUXCTL_PCTL_100TX_LPWR |
    4146                 :            :                                                MII_TG3_AUXCTL_PCTL_CL_AB_TXDAC);
    4147                 :          0 :                                 udelay(40);
    4148                 :            :                         }
    4149                 :            : 
    4150         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
    4151                 :            :                                 mac_mode = MAC_MODE_PORT_MODE_GMII;
    4152         [ #  # ]:          0 :                         else if (tp->phy_flags &
    4153                 :            :                                  TG3_PHYFLG_KEEP_LINK_ON_PWRDN) {
    4154         [ #  # ]:          0 :                                 if (tp->link_config.active_speed == SPEED_1000)
    4155                 :            :                                         mac_mode = MAC_MODE_PORT_MODE_GMII;
    4156                 :            :                                 else
    4157                 :          0 :                                         mac_mode = MAC_MODE_PORT_MODE_MII;
    4158                 :            :                         } else
    4159                 :            :                                 mac_mode = MAC_MODE_PORT_MODE_MII;
    4160                 :            : 
    4161                 :          0 :                         mac_mode |= tp->mac_mode & MAC_MODE_LINK_POLARITY;
    4162         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5700) {
    4163                 :          0 :                                 u32 speed = tg3_flag(tp, WOL_SPEED_100MB) ?
    4164         [ #  # ]:          0 :                                              SPEED_100 : SPEED_10;
    4165         [ #  # ]:          0 :                                 if (tg3_5700_link_polarity(tp, speed))
    4166                 :          0 :                                         mac_mode |= MAC_MODE_LINK_POLARITY;
    4167                 :            :                                 else
    4168                 :          0 :                                         mac_mode &= ~MAC_MODE_LINK_POLARITY;
    4169                 :            :                         }
    4170                 :            :                 } else {
    4171                 :            :                         mac_mode = MAC_MODE_PORT_MODE_TBI;
    4172                 :            :                 }
    4173                 :            : 
    4174         [ #  # ]:          0 :                 if (!tg3_flag(tp, 5750_PLUS))
    4175                 :          0 :                         tw32(MAC_LED_CTRL, tp->led_ctrl);
    4176                 :            : 
    4177                 :          0 :                 mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE;
    4178   [ #  #  #  #  :          0 :                 if ((tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, 5780_CLASS)) &&
                   #  # ]
    4179         [ #  # ]:          0 :                     (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE)))
    4180                 :          0 :                         mac_mode |= MAC_MODE_KEEP_FRAME_IN_WOL;
    4181                 :            : 
    4182         [ #  # ]:          0 :                 if (tg3_flag(tp, ENABLE_APE))
    4183                 :          0 :                         mac_mode |= MAC_MODE_APE_TX_EN |
    4184                 :            :                                     MAC_MODE_APE_RX_EN |
    4185                 :            :                                     MAC_MODE_TDE_ENABLE;
    4186                 :            : 
    4187                 :          0 :                 tw32_f(MAC_MODE, mac_mode);
    4188                 :          0 :                 udelay(100);
    4189                 :            : 
    4190                 :          0 :                 tw32_f(MAC_RX_MODE, RX_MODE_ENABLE);
    4191                 :          0 :                 udelay(10);
    4192                 :            :         }
    4193                 :            : 
    4194         [ #  # ]:          0 :         if (!tg3_flag(tp, WOL_SPEED_100MB) &&
    4195         [ #  # ]:          0 :             (tg3_asic_rev(tp) == ASIC_REV_5700 ||
    4196                 :          0 :              tg3_asic_rev(tp) == ASIC_REV_5701)) {
    4197                 :          0 :                 u32 base_val;
    4198                 :            : 
    4199                 :          0 :                 base_val = tp->pci_clock_ctrl;
    4200                 :          0 :                 base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
    4201                 :            :                              CLOCK_CTRL_TXCLK_DISABLE);
    4202                 :            : 
    4203                 :          0 :                 tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK |
    4204                 :            :                             CLOCK_CTRL_PWRDOWN_PLL133, 40);
    4205   [ #  #  #  # ]:          0 :         } else if (tg3_flag(tp, 5780_CLASS) ||
    4206                 :          0 :                    tg3_flag(tp, CPMU_PRESENT) ||
    4207         [ #  # ]:          0 :                    tg3_asic_rev(tp) == ASIC_REV_5906) {
    4208                 :            :                 /* do nothing */
    4209   [ #  #  #  # ]:          0 :         } else if (!(tg3_flag(tp, 5750_PLUS) && tg3_flag(tp, ENABLE_ASF))) {
    4210                 :          0 :                 u32 newbits1, newbits2;
    4211                 :            : 
    4212         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
    4213                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5701) {
    4214                 :            :                         newbits1 = (CLOCK_CTRL_RXCLK_DISABLE |
    4215                 :            :                                     CLOCK_CTRL_TXCLK_DISABLE |
    4216                 :            :                                     CLOCK_CTRL_ALTCLK);
    4217                 :            :                         newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
    4218         [ #  # ]:          0 :                 } else if (tg3_flag(tp, 5705_PLUS)) {
    4219                 :            :                         newbits1 = CLOCK_CTRL_625_CORE;
    4220                 :            :                         newbits2 = newbits1 | CLOCK_CTRL_ALTCLK;
    4221                 :            :                 } else {
    4222                 :          0 :                         newbits1 = CLOCK_CTRL_ALTCLK;
    4223                 :          0 :                         newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
    4224                 :            :                 }
    4225                 :            : 
    4226                 :          0 :                 tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1,
    4227                 :            :                             40);
    4228                 :            : 
    4229                 :          0 :                 tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2,
    4230                 :            :                             40);
    4231                 :            : 
    4232         [ #  # ]:          0 :                 if (!tg3_flag(tp, 5705_PLUS)) {
    4233                 :          0 :                         u32 newbits3;
    4234                 :            : 
    4235         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
    4236                 :            :                             tg3_asic_rev(tp) == ASIC_REV_5701) {
    4237                 :            :                                 newbits3 = (CLOCK_CTRL_RXCLK_DISABLE |
    4238                 :            :                                             CLOCK_CTRL_TXCLK_DISABLE |
    4239                 :            :                                             CLOCK_CTRL_44MHZ_CORE);
    4240                 :            :                         } else {
    4241                 :          0 :                                 newbits3 = CLOCK_CTRL_44MHZ_CORE;
    4242                 :            :                         }
    4243                 :            : 
    4244                 :          0 :                         tw32_wait_f(TG3PCI_CLOCK_CTRL,
    4245                 :            :                                     tp->pci_clock_ctrl | newbits3, 40);
    4246                 :            :                 }
    4247                 :            :         }
    4248                 :            : 
    4249   [ #  #  #  # ]:          0 :         if (!(device_should_wake) && !tg3_flag(tp, ENABLE_ASF))
    4250                 :          0 :                 tg3_power_down_phy(tp, do_low_power);
    4251                 :            : 
    4252                 :          0 :         tg3_frob_aux_power(tp, true);
    4253                 :            : 
    4254                 :            :         /* Workaround for unstable PLL clock */
    4255         [ #  # ]:          0 :         if ((!tg3_flag(tp, IS_SSB_CORE)) &&
    4256         [ #  # ]:          0 :             ((tg3_chip_rev(tp) == CHIPREV_5750_AX) ||
    4257                 :            :              (tg3_chip_rev(tp) == CHIPREV_5750_BX))) {
    4258                 :          0 :                 u32 val = tr32(0x7d00);
    4259                 :            : 
    4260                 :          0 :                 val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1);
    4261                 :          0 :                 tw32(0x7d00, val);
    4262         [ #  # ]:          0 :                 if (!tg3_flag(tp, ENABLE_ASF)) {
    4263                 :          0 :                         int err;
    4264                 :            : 
    4265                 :          0 :                         err = tg3_nvram_lock(tp);
    4266                 :          0 :                         tg3_halt_cpu(tp, RX_CPU_BASE);
    4267         [ #  # ]:          0 :                         if (!err)
    4268                 :          0 :                                 tg3_nvram_unlock(tp);
    4269                 :            :                 }
    4270                 :            :         }
    4271                 :            : 
    4272                 :          0 :         tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
    4273                 :            : 
    4274                 :          0 :         tg3_ape_driver_state_change(tp, RESET_KIND_SHUTDOWN);
    4275                 :            : 
    4276                 :          0 :         return 0;
    4277                 :            : }
    4278                 :            : 
    4279                 :          0 : static void tg3_power_down(struct tg3 *tp)
    4280                 :            : {
    4281                 :          0 :         pci_wake_from_d3(tp->pdev, tg3_flag(tp, WOL_ENABLE));
    4282                 :          0 :         pci_set_power_state(tp->pdev, PCI_D3hot);
    4283                 :          0 : }
    4284                 :            : 
    4285                 :            : static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u32 *speed, u8 *duplex)
    4286                 :            : {
    4287                 :            :         switch (val & MII_TG3_AUX_STAT_SPDMASK) {
    4288                 :            :         case MII_TG3_AUX_STAT_10HALF:
    4289                 :            :                 *speed = SPEED_10;
    4290                 :            :                 *duplex = DUPLEX_HALF;
    4291                 :            :                 break;
    4292                 :            : 
    4293                 :            :         case MII_TG3_AUX_STAT_10FULL:
    4294                 :            :                 *speed = SPEED_10;
    4295                 :            :                 *duplex = DUPLEX_FULL;
    4296                 :            :                 break;
    4297                 :            : 
    4298                 :            :         case MII_TG3_AUX_STAT_100HALF:
    4299                 :            :                 *speed = SPEED_100;
    4300                 :            :                 *duplex = DUPLEX_HALF;
    4301                 :            :                 break;
    4302                 :            : 
    4303                 :            :         case MII_TG3_AUX_STAT_100FULL:
    4304                 :            :                 *speed = SPEED_100;
    4305                 :            :                 *duplex = DUPLEX_FULL;
    4306                 :            :                 break;
    4307                 :            : 
    4308                 :            :         case MII_TG3_AUX_STAT_1000HALF:
    4309                 :            :                 *speed = SPEED_1000;
    4310                 :            :                 *duplex = DUPLEX_HALF;
    4311                 :            :                 break;
    4312                 :            : 
    4313                 :            :         case MII_TG3_AUX_STAT_1000FULL:
    4314                 :            :                 *speed = SPEED_1000;
    4315                 :            :                 *duplex = DUPLEX_FULL;
    4316                 :            :                 break;
    4317                 :            : 
    4318                 :            :         default:
    4319                 :            :                 if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
    4320                 :            :                         *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 :
    4321                 :            :                                  SPEED_10;
    4322                 :            :                         *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL :
    4323                 :            :                                   DUPLEX_HALF;
    4324                 :            :                         break;
    4325                 :            :                 }
    4326                 :            :                 *speed = SPEED_UNKNOWN;
    4327                 :            :                 *duplex = DUPLEX_UNKNOWN;
    4328                 :            :                 break;
    4329                 :            :         }
    4330                 :            : }
    4331                 :            : 
    4332                 :          0 : static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl)
    4333                 :            : {
    4334                 :          0 :         int err = 0;
    4335                 :          0 :         u32 val, new_adv;
    4336                 :            : 
    4337                 :          0 :         new_adv = ADVERTISE_CSMA;
    4338                 :          0 :         new_adv |= ethtool_adv_to_mii_adv_t(advertise) & ADVERTISE_ALL;
    4339         [ #  # ]:          0 :         new_adv |= mii_advertise_flowctrl(flowctrl);
    4340                 :            : 
    4341                 :          0 :         err = tg3_writephy(tp, MII_ADVERTISE, new_adv);
    4342         [ #  # ]:          0 :         if (err)
    4343                 :          0 :                 goto done;
    4344                 :            : 
    4345         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
    4346         [ #  # ]:          0 :                 new_adv = ethtool_adv_to_mii_ctrl1000_t(advertise);
    4347                 :            : 
    4348         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 ||
    4349                 :            :                     tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0)
    4350                 :          0 :                         new_adv |= CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER;
    4351                 :            : 
    4352                 :          0 :                 err = tg3_writephy(tp, MII_CTRL1000, new_adv);
    4353         [ #  # ]:          0 :                 if (err)
    4354                 :          0 :                         goto done;
    4355                 :            :         }
    4356                 :            : 
    4357         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP))
    4358                 :          0 :                 goto done;
    4359                 :            : 
    4360                 :          0 :         tw32(TG3_CPMU_EEE_MODE,
    4361                 :            :              tr32(TG3_CPMU_EEE_MODE) & ~TG3_CPMU_EEEMD_LPI_ENABLE);
    4362                 :            : 
    4363                 :          0 :         err = tg3_phy_toggle_auxctl_smdsp(tp, true);
    4364         [ #  # ]:          0 :         if (!err) {
    4365                 :          0 :                 u32 err2;
    4366                 :            : 
    4367                 :          0 :                 val = 0;
    4368                 :            :                 /* Advertise 100-BaseTX EEE ability */
    4369         [ #  # ]:          0 :                 if (advertise & ADVERTISED_100baseT_Full)
    4370                 :          0 :                         val |= MDIO_AN_EEE_ADV_100TX;
    4371                 :            :                 /* Advertise 1000-BaseT EEE ability */
    4372         [ #  # ]:          0 :                 if (advertise & ADVERTISED_1000baseT_Full)
    4373                 :          0 :                         val |= MDIO_AN_EEE_ADV_1000T;
    4374                 :            : 
    4375         [ #  # ]:          0 :                 if (!tp->eee.eee_enabled) {
    4376                 :          0 :                         val = 0;
    4377                 :          0 :                         tp->eee.advertised = 0;
    4378                 :            :                 } else {
    4379                 :          0 :                         tp->eee.advertised = advertise &
    4380                 :            :                                              (ADVERTISED_100baseT_Full |
    4381                 :            :                                               ADVERTISED_1000baseT_Full);
    4382                 :            :                 }
    4383                 :            : 
    4384                 :          0 :                 err = tg3_phy_cl45_write(tp, MDIO_MMD_AN, MDIO_AN_EEE_ADV, val);
    4385         [ #  # ]:          0 :                 if (err)
    4386                 :          0 :                         val = 0;
    4387                 :            : 
    4388      [ #  #  # ]:          0 :                 switch (tg3_asic_rev(tp)) {
    4389                 :          0 :                 case ASIC_REV_5717:
    4390                 :            :                 case ASIC_REV_57765:
    4391                 :            :                 case ASIC_REV_57766:
    4392                 :            :                 case ASIC_REV_5719:
    4393                 :            :                         /* If we advertised any eee advertisements above... */
    4394         [ #  # ]:          0 :                         if (val)
    4395                 :          0 :                                 val = MII_TG3_DSP_TAP26_ALNOKO |
    4396                 :            :                                       MII_TG3_DSP_TAP26_RMRXSTO |
    4397                 :            :                                       MII_TG3_DSP_TAP26_OPCSINPT;
    4398                 :          0 :                         tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val);
    4399                 :            :                         /* Fall through */
    4400                 :          0 :                 case ASIC_REV_5720:
    4401                 :            :                 case ASIC_REV_5762:
    4402         [ #  # ]:          0 :                         if (!tg3_phydsp_read(tp, MII_TG3_DSP_CH34TP2, &val))
    4403                 :          0 :                                 tg3_phydsp_write(tp, MII_TG3_DSP_CH34TP2, val |
    4404                 :            :                                                  MII_TG3_DSP_CH34TP2_HIBW01);
    4405                 :            :                 }
    4406                 :            : 
    4407                 :          0 :                 err2 = tg3_phy_toggle_auxctl_smdsp(tp, false);
    4408         [ #  # ]:          0 :                 if (!err)
    4409                 :          0 :                         err = err2;
    4410                 :            :         }
    4411                 :            : 
    4412                 :          0 : done:
    4413                 :          0 :         return err;
    4414                 :            : }
    4415                 :            : 
    4416                 :          0 : static void tg3_phy_copper_begin(struct tg3 *tp)
    4417                 :            : {
    4418         [ #  # ]:          0 :         if (tp->link_config.autoneg == AUTONEG_ENABLE ||
    4419         [ #  # ]:          0 :             (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) {
    4420                 :          0 :                 u32 adv, fc;
    4421                 :            : 
    4422         [ #  # ]:          0 :                 if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) &&
    4423                 :            :                     !(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN)) {
    4424                 :          0 :                         adv = ADVERTISED_10baseT_Half |
    4425                 :            :                               ADVERTISED_10baseT_Full;
    4426         [ #  # ]:          0 :                         if (tg3_flag(tp, WOL_SPEED_100MB))
    4427                 :          0 :                                 adv |= ADVERTISED_100baseT_Half |
    4428                 :            :                                        ADVERTISED_100baseT_Full;
    4429         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_1G_ON_VAUX_OK) {
    4430         [ #  # ]:          0 :                                 if (!(tp->phy_flags &
    4431                 :            :                                       TG3_PHYFLG_DISABLE_1G_HD_ADV))
    4432                 :          0 :                                         adv |= ADVERTISED_1000baseT_Half;
    4433                 :          0 :                                 adv |= ADVERTISED_1000baseT_Full;
    4434                 :            :                         }
    4435                 :            : 
    4436                 :            :                         fc = FLOW_CTRL_TX | FLOW_CTRL_RX;
    4437                 :            :                 } else {
    4438                 :          0 :                         adv = tp->link_config.advertising;
    4439         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
    4440                 :          0 :                                 adv &= ~(ADVERTISED_1000baseT_Half |
    4441                 :            :                                          ADVERTISED_1000baseT_Full);
    4442                 :            : 
    4443                 :          0 :                         fc = tp->link_config.flowctrl;
    4444                 :            :                 }
    4445                 :            : 
    4446                 :          0 :                 tg3_phy_autoneg_cfg(tp, adv, fc);
    4447                 :            : 
    4448         [ #  # ]:          0 :                 if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) &&
    4449                 :            :                     (tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN)) {
    4450                 :            :                         /* Normally during power down we want to autonegotiate
    4451                 :            :                          * the lowest possible speed for WOL. However, to avoid
    4452                 :            :                          * link flap, we leave it untouched.
    4453                 :            :                          */
    4454                 :            :                         return;
    4455                 :            :                 }
    4456                 :            : 
    4457                 :          0 :                 tg3_writephy(tp, MII_BMCR,
    4458                 :            :                              BMCR_ANENABLE | BMCR_ANRESTART);
    4459                 :            :         } else {
    4460                 :          0 :                 int i;
    4461                 :          0 :                 u32 bmcr, orig_bmcr;
    4462                 :            : 
    4463                 :          0 :                 tp->link_config.active_speed = tp->link_config.speed;
    4464                 :          0 :                 tp->link_config.active_duplex = tp->link_config.duplex;
    4465                 :            : 
    4466         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5714) {
    4467                 :            :                         /* With autoneg disabled, 5715 only links up when the
    4468                 :            :                          * advertisement register has the configured speed
    4469                 :            :                          * enabled.
    4470                 :            :                          */
    4471                 :          0 :                         tg3_writephy(tp, MII_ADVERTISE, ADVERTISE_ALL);
    4472                 :            :                 }
    4473                 :            : 
    4474                 :          0 :                 bmcr = 0;
    4475      [ #  #  # ]:          0 :                 switch (tp->link_config.speed) {
    4476                 :            :                 default:
    4477                 :            :                 case SPEED_10:
    4478                 :            :                         break;
    4479                 :            : 
    4480                 :          0 :                 case SPEED_100:
    4481                 :          0 :                         bmcr |= BMCR_SPEED100;
    4482                 :          0 :                         break;
    4483                 :            : 
    4484                 :          0 :                 case SPEED_1000:
    4485                 :          0 :                         bmcr |= BMCR_SPEED1000;
    4486                 :          0 :                         break;
    4487                 :            :                 }
    4488                 :            : 
    4489         [ #  # ]:          0 :                 if (tp->link_config.duplex == DUPLEX_FULL)
    4490                 :          0 :                         bmcr |= BMCR_FULLDPLX;
    4491                 :            : 
    4492         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_BMCR, &orig_bmcr) &&
    4493         [ #  # ]:          0 :                     (bmcr != orig_bmcr)) {
    4494                 :          0 :                         tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK);
    4495         [ #  # ]:          0 :                         for (i = 0; i < 1500; i++) {
    4496                 :          0 :                                 u32 tmp;
    4497                 :            : 
    4498                 :          0 :                                 udelay(10);
    4499   [ #  #  #  # ]:          0 :                                 if (tg3_readphy(tp, MII_BMSR, &tmp) ||
    4500                 :            :                                     tg3_readphy(tp, MII_BMSR, &tmp))
    4501                 :          0 :                                         continue;
    4502         [ #  # ]:          0 :                                 if (!(tmp & BMSR_LSTATUS)) {
    4503                 :          0 :                                         udelay(40);
    4504                 :          0 :                                         break;
    4505                 :            :                                 }
    4506                 :            :                         }
    4507                 :          0 :                         tg3_writephy(tp, MII_BMCR, bmcr);
    4508                 :          0 :                         udelay(40);
    4509                 :            :                 }
    4510                 :            :         }
    4511                 :            : }
    4512                 :            : 
    4513                 :          0 : static int tg3_phy_pull_config(struct tg3 *tp)
    4514                 :            : {
    4515                 :          0 :         int err;
    4516                 :          0 :         u32 val;
    4517                 :            : 
    4518                 :          0 :         err = tg3_readphy(tp, MII_BMCR, &val);
    4519         [ #  # ]:          0 :         if (err)
    4520                 :          0 :                 goto done;
    4521                 :            : 
    4522         [ #  # ]:          0 :         if (!(val & BMCR_ANENABLE)) {
    4523                 :          0 :                 tp->link_config.autoneg = AUTONEG_DISABLE;
    4524                 :          0 :                 tp->link_config.advertising = 0;
    4525                 :          0 :                 tg3_flag_clear(tp, PAUSE_AUTONEG);
    4526                 :            : 
    4527                 :          0 :                 err = -EIO;
    4528                 :            : 
    4529   [ #  #  #  # ]:          0 :                 switch (val & (BMCR_SPEED1000 | BMCR_SPEED100)) {
    4530                 :          0 :                 case 0:
    4531         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
    4532                 :          0 :                                 goto done;
    4533                 :            : 
    4534                 :          0 :                         tp->link_config.speed = SPEED_10;
    4535                 :          0 :                         break;
    4536                 :          0 :                 case BMCR_SPEED100:
    4537         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
    4538                 :          0 :                                 goto done;
    4539                 :            : 
    4540                 :          0 :                         tp->link_config.speed = SPEED_100;
    4541                 :          0 :                         break;
    4542                 :          0 :                 case BMCR_SPEED1000:
    4543         [ #  # ]:          0 :                         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
    4544                 :          0 :                                 tp->link_config.speed = SPEED_1000;
    4545                 :          0 :                                 break;
    4546                 :            :                         }
    4547                 :            :                         /* Fall through */
    4548                 :            :                 default:
    4549                 :          0 :                         goto done;
    4550                 :            :                 }
    4551                 :            : 
    4552         [ #  # ]:          0 :                 if (val & BMCR_FULLDPLX)
    4553                 :          0 :                         tp->link_config.duplex = DUPLEX_FULL;
    4554                 :            :                 else
    4555                 :          0 :                         tp->link_config.duplex = DUPLEX_HALF;
    4556                 :            : 
    4557                 :          0 :                 tp->link_config.flowctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
    4558                 :            : 
    4559                 :          0 :                 err = 0;
    4560                 :          0 :                 goto done;
    4561                 :            :         }
    4562                 :            : 
    4563                 :          0 :         tp->link_config.autoneg = AUTONEG_ENABLE;
    4564                 :          0 :         tp->link_config.advertising = ADVERTISED_Autoneg;
    4565                 :          0 :         tg3_flag_set(tp, PAUSE_AUTONEG);
    4566                 :            : 
    4567         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
    4568                 :          0 :                 u32 adv;
    4569                 :            : 
    4570                 :          0 :                 err = tg3_readphy(tp, MII_ADVERTISE, &val);
    4571         [ #  # ]:          0 :                 if (err)
    4572                 :          0 :                         goto done;
    4573                 :            : 
    4574                 :          0 :                 adv = mii_adv_to_ethtool_adv_t(val & ADVERTISE_ALL);
    4575                 :          0 :                 tp->link_config.advertising |= adv | ADVERTISED_TP;
    4576                 :            : 
    4577         [ #  # ]:          0 :                 tp->link_config.flowctrl = tg3_decode_flowctrl_1000T(val);
    4578                 :            :         } else {
    4579                 :          0 :                 tp->link_config.advertising |= ADVERTISED_FIBRE;
    4580                 :            :         }
    4581                 :            : 
    4582         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
    4583                 :          0 :                 u32 adv;
    4584                 :            : 
    4585         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
    4586                 :          0 :                         err = tg3_readphy(tp, MII_CTRL1000, &val);
    4587         [ #  # ]:          0 :                         if (err)
    4588                 :          0 :                                 goto done;
    4589                 :            : 
    4590         [ #  # ]:          0 :                         adv = mii_ctrl1000_to_ethtool_adv_t(val);
    4591                 :            :                 } else {
    4592                 :          0 :                         err = tg3_readphy(tp, MII_ADVERTISE, &val);
    4593         [ #  # ]:          0 :                         if (err)
    4594                 :          0 :                                 goto done;
    4595                 :            : 
    4596         [ #  # ]:          0 :                         adv = tg3_decode_flowctrl_1000X(val);
    4597                 :          0 :                         tp->link_config.flowctrl = adv;
    4598                 :            : 
    4599                 :          0 :                         val &= (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL);
    4600         [ #  # ]:          0 :                         adv = mii_adv_to_ethtool_adv_x(val);
    4601                 :            :                 }
    4602                 :            : 
    4603                 :          0 :                 tp->link_config.advertising |= adv;
    4604                 :            :         }
    4605                 :            : 
    4606                 :          0 : done:
    4607                 :          0 :         return err;
    4608                 :            : }
    4609                 :            : 
    4610                 :          0 : static int tg3_init_5401phy_dsp(struct tg3 *tp)
    4611                 :            : {
    4612                 :          0 :         int err;
    4613                 :            : 
    4614                 :            :         /* Turn off tap power management. */
    4615                 :            :         /* Set Extended packet length bit */
    4616                 :          0 :         err = tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
    4617                 :            : 
    4618                 :          0 :         err |= tg3_phydsp_write(tp, 0x0012, 0x1804);
    4619                 :          0 :         err |= tg3_phydsp_write(tp, 0x0013, 0x1204);
    4620                 :          0 :         err |= tg3_phydsp_write(tp, 0x8006, 0x0132);
    4621                 :          0 :         err |= tg3_phydsp_write(tp, 0x8006, 0x0232);
    4622                 :          0 :         err |= tg3_phydsp_write(tp, 0x201f, 0x0a20);
    4623                 :            : 
    4624                 :          0 :         udelay(40);
    4625                 :            : 
    4626                 :          0 :         return err;
    4627                 :            : }
    4628                 :            : 
    4629                 :          0 : static bool tg3_phy_eee_config_ok(struct tg3 *tp)
    4630                 :            : {
    4631                 :          0 :         struct ethtool_eee eee;
    4632                 :            : 
    4633         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP))
    4634                 :            :                 return true;
    4635                 :            : 
    4636                 :          0 :         tg3_eee_pull_config(tp, &eee);
    4637                 :            : 
    4638         [ #  # ]:          0 :         if (tp->eee.eee_enabled) {
    4639         [ #  # ]:          0 :                 if (tp->eee.advertised != eee.advertised ||
    4640         [ #  # ]:          0 :                     tp->eee.tx_lpi_timer != eee.tx_lpi_timer ||
    4641         [ #  # ]:          0 :                     tp->eee.tx_lpi_enabled != eee.tx_lpi_enabled)
    4642                 :          0 :                         return false;
    4643                 :            :         } else {
    4644                 :            :                 /* EEE is disabled but we're advertising */
    4645         [ #  # ]:          0 :                 if (eee.advertised)
    4646                 :          0 :                         return false;
    4647                 :            :         }
    4648                 :            : 
    4649                 :            :         return true;
    4650                 :            : }
    4651                 :            : 
    4652                 :          0 : static bool tg3_phy_copper_an_config_ok(struct tg3 *tp, u32 *lcladv)
    4653                 :            : {
    4654                 :          0 :         u32 advmsk, tgtadv, advertising;
    4655                 :            : 
    4656                 :          0 :         advertising = tp->link_config.advertising;
    4657                 :          0 :         tgtadv = ethtool_adv_to_mii_adv_t(advertising) & ADVERTISE_ALL;
    4658                 :            : 
    4659                 :          0 :         advmsk = ADVERTISE_ALL;
    4660         [ #  # ]:          0 :         if (tp->link_config.active_duplex == DUPLEX_FULL) {
    4661         [ #  # ]:          0 :                 tgtadv |= mii_advertise_flowctrl(tp->link_config.flowctrl);
    4662                 :          0 :                 advmsk |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
    4663                 :            :         }
    4664                 :            : 
    4665         [ #  # ]:          0 :         if (tg3_readphy(tp, MII_ADVERTISE, lcladv))
    4666                 :            :                 return false;
    4667                 :            : 
    4668         [ #  # ]:          0 :         if ((*lcladv & advmsk) != tgtadv)
    4669                 :            :                 return false;
    4670                 :            : 
    4671         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
    4672                 :          0 :                 u32 tg3_ctrl;
    4673                 :            : 
    4674         [ #  # ]:          0 :                 tgtadv = ethtool_adv_to_mii_ctrl1000_t(advertising);
    4675                 :            : 
    4676         [ #  # ]:          0 :                 if (tg3_readphy(tp, MII_CTRL1000, &tg3_ctrl))
    4677                 :          0 :                         return false;
    4678                 :            : 
    4679         [ #  # ]:          0 :                 if (tgtadv &&
    4680         [ #  # ]:          0 :                     (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 ||
    4681                 :            :                      tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0)) {
    4682                 :          0 :                         tgtadv |= CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER;
    4683                 :          0 :                         tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL |
    4684                 :            :                                      CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER);
    4685                 :            :                 } else {
    4686                 :          0 :                         tg3_ctrl &= (ADVERTISE_1000HALF | ADVERTISE_1000FULL);
    4687                 :            :                 }
    4688                 :            : 
    4689         [ #  # ]:          0 :                 if (tg3_ctrl != tgtadv)
    4690                 :            :                         return false;
    4691                 :            :         }
    4692                 :            : 
    4693                 :            :         return true;
    4694                 :            : }
    4695                 :            : 
    4696                 :          0 : static bool tg3_phy_copper_fetch_rmtadv(struct tg3 *tp, u32 *rmtadv)
    4697                 :            : {
    4698                 :          0 :         u32 lpeth = 0;
    4699                 :            : 
    4700         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
    4701                 :          0 :                 u32 val;
    4702                 :            : 
    4703         [ #  # ]:          0 :                 if (tg3_readphy(tp, MII_STAT1000, &val))
    4704                 :          0 :                         return false;
    4705                 :            : 
    4706         [ #  # ]:          0 :                 lpeth = mii_stat1000_to_ethtool_lpa_t(val);
    4707                 :            :         }
    4708                 :            : 
    4709         [ #  # ]:          0 :         if (tg3_readphy(tp, MII_LPA, rmtadv))
    4710                 :            :                 return false;
    4711                 :            : 
    4712         [ #  # ]:          0 :         lpeth |= mii_lpa_to_ethtool_lpa_t(*rmtadv);
    4713                 :          0 :         tp->link_config.rmt_adv = lpeth;
    4714                 :            : 
    4715                 :          0 :         return true;
    4716                 :            : }
    4717                 :            : 
    4718                 :          0 : static bool tg3_test_and_report_link_chg(struct tg3 *tp, bool curr_link_up)
    4719                 :            : {
    4720         [ #  # ]:          0 :         if (curr_link_up != tp->link_up) {
    4721         [ #  # ]:          0 :                 if (curr_link_up) {
    4722                 :          0 :                         netif_carrier_on(tp->dev);
    4723                 :            :                 } else {
    4724                 :          0 :                         netif_carrier_off(tp->dev);
    4725         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
    4726                 :          0 :                                 tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    4727                 :            :                 }
    4728                 :            : 
    4729                 :          0 :                 tg3_link_report(tp);
    4730                 :          0 :                 return true;
    4731                 :            :         }
    4732                 :            : 
    4733                 :            :         return false;
    4734                 :            : }
    4735                 :            : 
    4736                 :          0 : static void tg3_clear_mac_status(struct tg3 *tp)
    4737                 :            : {
    4738                 :          0 :         tw32(MAC_EVENT, 0);
    4739                 :            : 
    4740                 :          0 :         tw32_f(MAC_STATUS,
    4741                 :            :                MAC_STATUS_SYNC_CHANGED |
    4742                 :            :                MAC_STATUS_CFG_CHANGED |
    4743                 :            :                MAC_STATUS_MI_COMPLETION |
    4744                 :            :                MAC_STATUS_LNKSTATE_CHANGED);
    4745                 :          0 :         udelay(40);
    4746                 :          0 : }
    4747                 :            : 
    4748                 :          0 : static void tg3_setup_eee(struct tg3 *tp)
    4749                 :            : {
    4750                 :          0 :         u32 val;
    4751                 :            : 
    4752                 :          0 :         val = TG3_CPMU_EEE_LNKIDL_PCIE_NL0 |
    4753                 :            :               TG3_CPMU_EEE_LNKIDL_UART_IDL;
    4754         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0)
    4755                 :          0 :                 val |= TG3_CPMU_EEE_LNKIDL_APE_TX_MT;
    4756                 :            : 
    4757                 :          0 :         tw32_f(TG3_CPMU_EEE_LNKIDL_CTRL, val);
    4758                 :            : 
    4759                 :          0 :         tw32_f(TG3_CPMU_EEE_CTRL,
    4760                 :            :                TG3_CPMU_EEE_CTRL_EXIT_20_1_US);
    4761                 :            : 
    4762                 :          0 :         val = TG3_CPMU_EEEMD_ERLY_L1_XIT_DET |
    4763                 :          0 :               (tp->eee.tx_lpi_enabled ? TG3_CPMU_EEEMD_LPI_IN_TX : 0) |
    4764         [ #  # ]:          0 :               TG3_CPMU_EEEMD_LPI_IN_RX |
    4765                 :            :               TG3_CPMU_EEEMD_EEE_ENABLE;
    4766                 :            : 
    4767         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5717)
    4768                 :          0 :                 val |= TG3_CPMU_EEEMD_SND_IDX_DET_EN;
    4769                 :            : 
    4770         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE))
    4771                 :          0 :                 val |= TG3_CPMU_EEEMD_APE_TX_DET_EN;
    4772                 :            : 
    4773         [ #  # ]:          0 :         tw32_f(TG3_CPMU_EEE_MODE, tp->eee.eee_enabled ? val : 0);
    4774                 :            : 
    4775                 :          0 :         tw32_f(TG3_CPMU_EEE_DBTMR1,
    4776                 :            :                TG3_CPMU_DBTMR1_PCIEXIT_2047US |
    4777                 :            :                (tp->eee.tx_lpi_timer & 0xffff));
    4778                 :            : 
    4779                 :          0 :         tw32_f(TG3_CPMU_EEE_DBTMR2,
    4780                 :            :                TG3_CPMU_DBTMR2_APE_TX_2047US |
    4781                 :            :                TG3_CPMU_DBTMR2_TXIDXEQ_2047US);
    4782                 :          0 : }
    4783                 :            : 
    4784                 :          0 : static int tg3_setup_copper_phy(struct tg3 *tp, bool force_reset)
    4785                 :            : {
    4786                 :          0 :         bool current_link_up;
    4787                 :          0 :         u32 bmsr, val;
    4788                 :          0 :         u32 lcl_adv, rmt_adv;
    4789                 :          0 :         u32 current_speed;
    4790                 :          0 :         u8 current_duplex;
    4791                 :          0 :         int i, err;
    4792                 :            : 
    4793                 :          0 :         tg3_clear_mac_status(tp);
    4794                 :            : 
    4795         [ #  # ]:          0 :         if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
    4796                 :          0 :                 tw32_f(MAC_MI_MODE,
    4797                 :            :                      (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
    4798                 :          0 :                 udelay(80);
    4799                 :            :         }
    4800                 :            : 
    4801                 :          0 :         tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, 0);
    4802                 :            : 
    4803                 :            :         /* Some third-party PHYs need to be reset on link going
    4804                 :            :          * down.
    4805                 :            :          */
    4806                 :          0 :         if ((tg3_asic_rev(tp) == ASIC_REV_5703 ||
    4807         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_5704 ||
    4808                 :          0 :              tg3_asic_rev(tp) == ASIC_REV_5705) &&
    4809         [ #  # ]:          0 :             tp->link_up) {
    4810                 :          0 :                 tg3_readphy(tp, MII_BMSR, &bmsr);
    4811         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
    4812         [ #  # ]:          0 :                     !(bmsr & BMSR_LSTATUS))
    4813                 :            :                         force_reset = true;
    4814                 :            :         }
    4815         [ #  # ]:          0 :         if (force_reset)
    4816                 :          0 :                 tg3_phy_reset(tp);
    4817                 :            : 
    4818         [ #  # ]:          0 :         if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
    4819                 :          0 :                 tg3_readphy(tp, MII_BMSR, &bmsr);
    4820   [ #  #  #  # ]:          0 :                 if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
    4821                 :          0 :                     !tg3_flag(tp, INIT_COMPLETE))
    4822                 :          0 :                         bmsr = 0;
    4823                 :            : 
    4824         [ #  # ]:          0 :                 if (!(bmsr & BMSR_LSTATUS)) {
    4825                 :          0 :                         err = tg3_init_5401phy_dsp(tp);
    4826         [ #  # ]:          0 :                         if (err)
    4827                 :            :                                 return err;
    4828                 :            : 
    4829                 :          0 :                         tg3_readphy(tp, MII_BMSR, &bmsr);
    4830         [ #  # ]:          0 :                         for (i = 0; i < 1000; i++) {
    4831                 :          0 :                                 udelay(10);
    4832         [ #  # ]:          0 :                                 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
    4833         [ #  # ]:          0 :                                     (bmsr & BMSR_LSTATUS)) {
    4834                 :          0 :                                         udelay(40);
    4835                 :            :                                         break;
    4836                 :            :                                 }
    4837                 :            :                         }
    4838                 :            : 
    4839         [ #  # ]:          0 :                         if ((tp->phy_id & TG3_PHY_ID_REV_MASK) ==
    4840                 :          0 :                             TG3_PHY_REV_BCM5401_B0 &&
    4841         [ #  # ]:          0 :                             !(bmsr & BMSR_LSTATUS) &&
    4842         [ #  # ]:          0 :                             tp->link_config.active_speed == SPEED_1000) {
    4843                 :          0 :                                 err = tg3_phy_reset(tp);
    4844         [ #  # ]:          0 :                                 if (!err)
    4845                 :          0 :                                         err = tg3_init_5401phy_dsp(tp);
    4846         [ #  # ]:          0 :                                 if (err)
    4847                 :            :                                         return err;
    4848                 :            :                         }
    4849                 :            :                 }
    4850         [ #  # ]:          0 :         } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 ||
    4851                 :            :                    tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0) {
    4852                 :            :                 /* 5701 {A0,B0} CRC bug workaround */
    4853                 :          0 :                 tg3_writephy(tp, 0x15, 0x0a75);
    4854                 :          0 :                 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
    4855                 :          0 :                 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
    4856                 :          0 :                 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
    4857                 :            :         }
    4858                 :            : 
    4859                 :            :         /* Clear pending interrupts... */
    4860                 :          0 :         tg3_readphy(tp, MII_TG3_ISTAT, &val);
    4861                 :          0 :         tg3_readphy(tp, MII_TG3_ISTAT, &val);
    4862                 :            : 
    4863         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT)
    4864                 :          0 :                 tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
    4865         [ #  # ]:          0 :         else if (!(tp->phy_flags & TG3_PHYFLG_IS_FET))
    4866                 :          0 :                 tg3_writephy(tp, MII_TG3_IMASK, ~0);
    4867                 :            : 
    4868         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
    4869                 :            :             tg3_asic_rev(tp) == ASIC_REV_5701) {
    4870         [ #  # ]:          0 :                 if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
    4871                 :          0 :                         tg3_writephy(tp, MII_TG3_EXT_CTRL,
    4872                 :            :                                      MII_TG3_EXT_CTRL_LNK3_LED_MODE);
    4873                 :            :                 else
    4874                 :          0 :                         tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
    4875                 :            :         }
    4876                 :            : 
    4877                 :          0 :         current_link_up = false;
    4878                 :          0 :         current_speed = SPEED_UNKNOWN;
    4879                 :          0 :         current_duplex = DUPLEX_UNKNOWN;
    4880                 :          0 :         tp->phy_flags &= ~TG3_PHYFLG_MDIX_STATE;
    4881                 :          0 :         tp->link_config.rmt_adv = 0;
    4882                 :            : 
    4883         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_CAPACITIVE_COUPLING) {
    4884                 :          0 :                 err = tg3_phy_auxctl_read(tp,
    4885                 :            :                                           MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
    4886                 :            :                                           &val);
    4887   [ #  #  #  # ]:          0 :                 if (!err && !(val & (1 << 10))) {
    4888                 :          0 :                         tg3_phy_auxctl_write(tp,
    4889                 :            :                                              MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
    4890                 :            :                                              val | (1 << 10));
    4891                 :          0 :                         goto relink;
    4892                 :            :                 }
    4893                 :            :         }
    4894                 :            : 
    4895                 :          0 :         bmsr = 0;
    4896         [ #  # ]:          0 :         for (i = 0; i < 100; i++) {
    4897                 :          0 :                 tg3_readphy(tp, MII_BMSR, &bmsr);
    4898         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
    4899         [ #  # ]:          0 :                     (bmsr & BMSR_LSTATUS))
    4900                 :            :                         break;
    4901                 :          0 :                 udelay(40);
    4902                 :            :         }
    4903                 :            : 
    4904         [ #  # ]:          0 :         if (bmsr & BMSR_LSTATUS) {
    4905                 :          0 :                 u32 aux_stat, bmcr;
    4906                 :            : 
    4907                 :          0 :                 tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
    4908         [ #  # ]:          0 :                 for (i = 0; i < 2000; i++) {
    4909                 :          0 :                         udelay(10);
    4910   [ #  #  #  # ]:          0 :                         if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
    4911                 :            :                             aux_stat)
    4912                 :            :                                 break;
    4913                 :            :                 }
    4914                 :            : 
    4915                 :          0 :                 tg3_aux_stat_to_speed_duplex(tp, aux_stat,
    4916                 :            :                                              &current_speed,
    4917                 :            :                                              &current_duplex);
    4918                 :            : 
    4919                 :          0 :                 bmcr = 0;
    4920         [ #  # ]:          0 :                 for (i = 0; i < 200; i++) {
    4921                 :          0 :                         tg3_readphy(tp, MII_BMCR, &bmcr);
    4922         [ #  # ]:          0 :                         if (tg3_readphy(tp, MII_BMCR, &bmcr))
    4923                 :          0 :                                 continue;
    4924         [ #  # ]:          0 :                         if (bmcr && bmcr != 0x7fff)
    4925                 :            :                                 break;
    4926                 :          0 :                         udelay(10);
    4927                 :            :                 }
    4928                 :            : 
    4929                 :          0 :                 lcl_adv = 0;
    4930                 :          0 :                 rmt_adv = 0;
    4931                 :            : 
    4932                 :          0 :                 tp->link_config.active_speed = current_speed;
    4933                 :          0 :                 tp->link_config.active_duplex = current_duplex;
    4934                 :            : 
    4935         [ #  # ]:          0 :                 if (tp->link_config.autoneg == AUTONEG_ENABLE) {
    4936                 :          0 :                         bool eee_config_ok = tg3_phy_eee_config_ok(tp);
    4937                 :            : 
    4938   [ #  #  #  # ]:          0 :                         if ((bmcr & BMCR_ANENABLE) &&
    4939         [ #  # ]:          0 :                             eee_config_ok &&
    4940         [ #  # ]:          0 :                             tg3_phy_copper_an_config_ok(tp, &lcl_adv) &&
    4941                 :          0 :                             tg3_phy_copper_fetch_rmtadv(tp, &rmt_adv))
    4942                 :          0 :                                 current_link_up = true;
    4943                 :            : 
    4944                 :            :                         /* EEE settings changes take effect only after a phy
    4945                 :            :                          * reset.  If we have skipped a reset due to Link Flap
    4946                 :            :                          * Avoidance being enabled, do it now.
    4947                 :            :                          */
    4948         [ #  # ]:          0 :                         if (!eee_config_ok &&
    4949   [ #  #  #  # ]:          0 :                             (tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) &&
    4950                 :            :                             !force_reset) {
    4951                 :          0 :                                 tg3_setup_eee(tp);
    4952                 :          0 :                                 tg3_phy_reset(tp);
    4953                 :            :                         }
    4954                 :            :                 } else {
    4955         [ #  # ]:          0 :                         if (!(bmcr & BMCR_ANENABLE) &&
    4956         [ #  # ]:          0 :                             tp->link_config.speed == current_speed &&
    4957         [ #  # ]:          0 :                             tp->link_config.duplex == current_duplex) {
    4958                 :            :                                 current_link_up = true;
    4959                 :            :                         }
    4960                 :            :                 }
    4961                 :            : 
    4962         [ #  # ]:          0 :                 if (current_link_up &&
    4963         [ #  # ]:          0 :                     tp->link_config.active_duplex == DUPLEX_FULL) {
    4964                 :          0 :                         u32 reg, bit;
    4965                 :            : 
    4966         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
    4967                 :            :                                 reg = MII_TG3_FET_GEN_STAT;
    4968                 :            :                                 bit = MII_TG3_FET_GEN_STAT_MDIXSTAT;
    4969                 :            :                         } else {
    4970                 :          0 :                                 reg = MII_TG3_EXT_STAT;
    4971                 :          0 :                                 bit = MII_TG3_EXT_STAT_MDIX;
    4972                 :            :                         }
    4973                 :            : 
    4974   [ #  #  #  # ]:          0 :                         if (!tg3_readphy(tp, reg, &val) && (val & bit))
    4975                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_MDIX_STATE;
    4976                 :            : 
    4977                 :          0 :                         tg3_setup_flow_control(tp, lcl_adv, rmt_adv);
    4978                 :            :                 }
    4979                 :            :         }
    4980                 :            : 
    4981                 :          0 : relink:
    4982   [ #  #  #  # ]:          0 :         if (!current_link_up || (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) {
    4983                 :          0 :                 tg3_phy_copper_begin(tp);
    4984                 :            : 
    4985         [ #  # ]:          0 :                 if (tg3_flag(tp, ROBOSWITCH)) {
    4986                 :          0 :                         current_link_up = true;
    4987                 :            :                         /* FIXME: when BCM5325 switch is used use 100 MBit/s */
    4988                 :          0 :                         current_speed = SPEED_1000;
    4989                 :          0 :                         current_duplex = DUPLEX_FULL;
    4990                 :          0 :                         tp->link_config.active_speed = current_speed;
    4991                 :          0 :                         tp->link_config.active_duplex = current_duplex;
    4992                 :            :                 }
    4993                 :            : 
    4994                 :          0 :                 tg3_readphy(tp, MII_BMSR, &bmsr);
    4995   [ #  #  #  # ]:          0 :                 if ((!tg3_readphy(tp, MII_BMSR, &bmsr) && (bmsr & BMSR_LSTATUS)) ||
    4996         [ #  # ]:          0 :                     (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK))
    4997                 :          0 :                         current_link_up = true;
    4998                 :            :         }
    4999                 :            : 
    5000                 :          0 :         tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
    5001         [ #  # ]:          0 :         if (current_link_up) {
    5002         [ #  # ]:          0 :                 if (tp->link_config.active_speed == SPEED_100 ||
    5003                 :            :                     tp->link_config.active_speed == SPEED_10)
    5004                 :          0 :                         tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
    5005                 :            :                 else
    5006                 :          0 :                         tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
    5007         [ #  # ]:          0 :         } else if (tp->phy_flags & TG3_PHYFLG_IS_FET)
    5008                 :          0 :                 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
    5009                 :            :         else
    5010                 :          0 :                 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
    5011                 :            : 
    5012                 :            :         /* In order for the 5750 core in BCM4785 chip to work properly
    5013                 :            :          * in RGMII mode, the Led Control Register must be set up.
    5014                 :            :          */
    5015         [ #  # ]:          0 :         if (tg3_flag(tp, RGMII_MODE)) {
    5016                 :          0 :                 u32 led_ctrl = tr32(MAC_LED_CTRL);
    5017                 :          0 :                 led_ctrl &= ~(LED_CTRL_1000MBPS_ON | LED_CTRL_100MBPS_ON);
    5018                 :            : 
    5019         [ #  # ]:          0 :                 if (tp->link_config.active_speed == SPEED_10)
    5020                 :          0 :                         led_ctrl |= LED_CTRL_LNKLED_OVERRIDE;
    5021         [ #  # ]:          0 :                 else if (tp->link_config.active_speed == SPEED_100)
    5022                 :          0 :                         led_ctrl |= (LED_CTRL_LNKLED_OVERRIDE |
    5023                 :            :                                      LED_CTRL_100MBPS_ON);
    5024         [ #  # ]:          0 :                 else if (tp->link_config.active_speed == SPEED_1000)
    5025                 :          0 :                         led_ctrl |= (LED_CTRL_LNKLED_OVERRIDE |
    5026                 :            :                                      LED_CTRL_1000MBPS_ON);
    5027                 :            : 
    5028                 :          0 :                 tw32(MAC_LED_CTRL, led_ctrl);
    5029                 :          0 :                 udelay(40);
    5030                 :            :         }
    5031                 :            : 
    5032                 :          0 :         tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
    5033         [ #  # ]:          0 :         if (tp->link_config.active_duplex == DUPLEX_HALF)
    5034                 :          0 :                 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
    5035                 :            : 
    5036         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700) {
    5037         [ #  # ]:          0 :                 if (current_link_up &&
    5038         [ #  # ]:          0 :                     tg3_5700_link_polarity(tp, tp->link_config.active_speed))
    5039                 :          0 :                         tp->mac_mode |= MAC_MODE_LINK_POLARITY;
    5040                 :            :                 else
    5041                 :          0 :                         tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
    5042                 :            :         }
    5043                 :            : 
    5044                 :            :         /* ??? Without this setting Netgear GA302T PHY does not
    5045                 :            :          * ??? send/receive packets...
    5046                 :            :          */
    5047   [ #  #  #  # ]:          0 :         if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411 &&
    5048                 :            :             tg3_chip_rev_id(tp) == CHIPREV_ID_5700_ALTIMA) {
    5049                 :          0 :                 tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
    5050                 :          0 :                 tw32_f(MAC_MI_MODE, tp->mi_mode);
    5051                 :          0 :                 udelay(80);
    5052                 :            :         }
    5053                 :            : 
    5054                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode);
    5055                 :          0 :         udelay(40);
    5056                 :            : 
    5057                 :          0 :         tg3_phy_eee_adjust(tp, current_link_up);
    5058                 :            : 
    5059         [ #  # ]:          0 :         if (tg3_flag(tp, USE_LINKCHG_REG)) {
    5060                 :            :                 /* Polled via timer. */
    5061                 :          0 :                 tw32_f(MAC_EVENT, 0);
    5062                 :            :         } else {
    5063                 :          0 :                 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
    5064                 :            :         }
    5065                 :          0 :         udelay(40);
    5066                 :            : 
    5067   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 &&
    5068                 :          0 :             current_link_up &&
    5069   [ #  #  #  # ]:          0 :             tp->link_config.active_speed == SPEED_1000 &&
    5070         [ #  # ]:          0 :             (tg3_flag(tp, PCIX_MODE) || tg3_flag(tp, PCI_HIGH_SPEED))) {
    5071                 :          0 :                 udelay(120);
    5072                 :          0 :                 tw32_f(MAC_STATUS,
    5073                 :            :                      (MAC_STATUS_SYNC_CHANGED |
    5074                 :            :                       MAC_STATUS_CFG_CHANGED));
    5075                 :          0 :                 udelay(40);
    5076                 :          0 :                 tg3_write_mem(tp,
    5077                 :            :                               NIC_SRAM_FIRMWARE_MBOX,
    5078                 :            :                               NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
    5079                 :            :         }
    5080                 :            : 
    5081                 :            :         /* Prevent send BD corruption. */
    5082         [ #  # ]:          0 :         if (tg3_flag(tp, CLKREQ_BUG)) {
    5083         [ #  # ]:          0 :                 if (tp->link_config.active_speed == SPEED_100 ||
    5084                 :            :                     tp->link_config.active_speed == SPEED_10)
    5085                 :          0 :                         pcie_capability_clear_word(tp->pdev, PCI_EXP_LNKCTL,
    5086                 :            :                                                    PCI_EXP_LNKCTL_CLKREQ_EN);
    5087                 :            :                 else
    5088                 :          0 :                         pcie_capability_set_word(tp->pdev, PCI_EXP_LNKCTL,
    5089                 :            :                                                  PCI_EXP_LNKCTL_CLKREQ_EN);
    5090                 :            :         }
    5091                 :            : 
    5092                 :          0 :         tg3_test_and_report_link_chg(tp, current_link_up);
    5093                 :            : 
    5094                 :          0 :         return 0;
    5095                 :            : }
    5096                 :            : 
    5097                 :            : struct tg3_fiber_aneginfo {
    5098                 :            :         int state;
    5099                 :            : #define ANEG_STATE_UNKNOWN              0
    5100                 :            : #define ANEG_STATE_AN_ENABLE            1
    5101                 :            : #define ANEG_STATE_RESTART_INIT         2
    5102                 :            : #define ANEG_STATE_RESTART              3
    5103                 :            : #define ANEG_STATE_DISABLE_LINK_OK      4
    5104                 :            : #define ANEG_STATE_ABILITY_DETECT_INIT  5
    5105                 :            : #define ANEG_STATE_ABILITY_DETECT       6
    5106                 :            : #define ANEG_STATE_ACK_DETECT_INIT      7
    5107                 :            : #define ANEG_STATE_ACK_DETECT           8
    5108                 :            : #define ANEG_STATE_COMPLETE_ACK_INIT    9
    5109                 :            : #define ANEG_STATE_COMPLETE_ACK         10
    5110                 :            : #define ANEG_STATE_IDLE_DETECT_INIT     11
    5111                 :            : #define ANEG_STATE_IDLE_DETECT          12
    5112                 :            : #define ANEG_STATE_LINK_OK              13
    5113                 :            : #define ANEG_STATE_NEXT_PAGE_WAIT_INIT  14
    5114                 :            : #define ANEG_STATE_NEXT_PAGE_WAIT       15
    5115                 :            : 
    5116                 :            :         u32 flags;
    5117                 :            : #define MR_AN_ENABLE            0x00000001
    5118                 :            : #define MR_RESTART_AN           0x00000002
    5119                 :            : #define MR_AN_COMPLETE          0x00000004
    5120                 :            : #define MR_PAGE_RX              0x00000008
    5121                 :            : #define MR_NP_LOADED            0x00000010
    5122                 :            : #define MR_TOGGLE_TX            0x00000020
    5123                 :            : #define MR_LP_ADV_FULL_DUPLEX   0x00000040
    5124                 :            : #define MR_LP_ADV_HALF_DUPLEX   0x00000080
    5125                 :            : #define MR_LP_ADV_SYM_PAUSE     0x00000100
    5126                 :            : #define MR_LP_ADV_ASYM_PAUSE    0x00000200
    5127                 :            : #define MR_LP_ADV_REMOTE_FAULT1 0x00000400
    5128                 :            : #define MR_LP_ADV_REMOTE_FAULT2 0x00000800
    5129                 :            : #define MR_LP_ADV_NEXT_PAGE     0x00001000
    5130                 :            : #define MR_TOGGLE_RX            0x00002000
    5131                 :            : #define MR_NP_RX                0x00004000
    5132                 :            : 
    5133                 :            : #define MR_LINK_OK              0x80000000
    5134                 :            : 
    5135                 :            :         unsigned long link_time, cur_time;
    5136                 :            : 
    5137                 :            :         u32 ability_match_cfg;
    5138                 :            :         int ability_match_count;
    5139                 :            : 
    5140                 :            :         char ability_match, idle_match, ack_match;
    5141                 :            : 
    5142                 :            :         u32 txconfig, rxconfig;
    5143                 :            : #define ANEG_CFG_NP             0x00000080
    5144                 :            : #define ANEG_CFG_ACK            0x00000040
    5145                 :            : #define ANEG_CFG_RF2            0x00000020
    5146                 :            : #define ANEG_CFG_RF1            0x00000010
    5147                 :            : #define ANEG_CFG_PS2            0x00000001
    5148                 :            : #define ANEG_CFG_PS1            0x00008000
    5149                 :            : #define ANEG_CFG_HD             0x00004000
    5150                 :            : #define ANEG_CFG_FD             0x00002000
    5151                 :            : #define ANEG_CFG_INVAL          0x00001f06
    5152                 :            : 
    5153                 :            : };
    5154                 :            : #define ANEG_OK         0
    5155                 :            : #define ANEG_DONE       1
    5156                 :            : #define ANEG_TIMER_ENAB 2
    5157                 :            : #define ANEG_FAILED     -1
    5158                 :            : 
    5159                 :            : #define ANEG_STATE_SETTLE_TIME  10000
    5160                 :            : 
    5161                 :          0 : static int tg3_fiber_aneg_smachine(struct tg3 *tp,
    5162                 :            :                                    struct tg3_fiber_aneginfo *ap)
    5163                 :            : {
    5164                 :          0 :         u16 flowctrl;
    5165                 :          0 :         unsigned long delta;
    5166                 :          0 :         u32 rx_cfg_reg;
    5167                 :          0 :         int ret;
    5168                 :            : 
    5169         [ #  # ]:          0 :         if (ap->state == ANEG_STATE_UNKNOWN) {
    5170                 :          0 :                 ap->rxconfig = 0;
    5171                 :          0 :                 ap->link_time = 0;
    5172                 :          0 :                 ap->cur_time = 0;
    5173                 :          0 :                 ap->ability_match_cfg = 0;
    5174                 :          0 :                 ap->ability_match_count = 0;
    5175                 :          0 :                 ap->ability_match = 0;
    5176                 :          0 :                 ap->idle_match = 0;
    5177                 :          0 :                 ap->ack_match = 0;
    5178                 :            :         }
    5179                 :          0 :         ap->cur_time++;
    5180                 :            : 
    5181         [ #  # ]:          0 :         if (tr32(MAC_STATUS) & MAC_STATUS_RCVD_CFG) {
    5182                 :          0 :                 rx_cfg_reg = tr32(MAC_RX_AUTO_NEG);
    5183                 :            : 
    5184         [ #  # ]:          0 :                 if (rx_cfg_reg != ap->ability_match_cfg) {
    5185                 :          0 :                         ap->ability_match_cfg = rx_cfg_reg;
    5186                 :          0 :                         ap->ability_match = 0;
    5187                 :          0 :                         ap->ability_match_count = 0;
    5188                 :            :                 } else {
    5189         [ #  # ]:          0 :                         if (++ap->ability_match_count > 1) {
    5190                 :          0 :                                 ap->ability_match = 1;
    5191                 :          0 :                                 ap->ability_match_cfg = rx_cfg_reg;
    5192                 :            :                         }
    5193                 :            :                 }
    5194         [ #  # ]:          0 :                 if (rx_cfg_reg & ANEG_CFG_ACK)
    5195                 :          0 :                         ap->ack_match = 1;
    5196                 :            :                 else
    5197                 :          0 :                         ap->ack_match = 0;
    5198                 :            : 
    5199                 :          0 :                 ap->idle_match = 0;
    5200                 :            :         } else {
    5201                 :          0 :                 ap->idle_match = 1;
    5202                 :          0 :                 ap->ability_match_cfg = 0;
    5203                 :          0 :                 ap->ability_match_count = 0;
    5204                 :          0 :                 ap->ability_match = 0;
    5205                 :          0 :                 ap->ack_match = 0;
    5206                 :            : 
    5207                 :          0 :                 rx_cfg_reg = 0;
    5208                 :            :         }
    5209                 :            : 
    5210                 :          0 :         ap->rxconfig = rx_cfg_reg;
    5211                 :          0 :         ret = ANEG_OK;
    5212                 :            : 
    5213   [ #  #  #  #  :          0 :         switch (ap->state) {
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    5214                 :            :         case ANEG_STATE_UNKNOWN:
    5215                 :            :                 if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN))
    5216                 :            :                         ap->state = ANEG_STATE_AN_ENABLE;
    5217                 :            : 
    5218                 :            :                 /* fall through */
    5219                 :            :         case ANEG_STATE_AN_ENABLE:
    5220                 :          0 :                 ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX);
    5221         [ #  # ]:          0 :                 if (ap->flags & MR_AN_ENABLE) {
    5222                 :          0 :                         ap->link_time = 0;
    5223                 :          0 :                         ap->cur_time = 0;
    5224                 :          0 :                         ap->ability_match_cfg = 0;
    5225                 :          0 :                         ap->ability_match_count = 0;
    5226                 :          0 :                         ap->ability_match = 0;
    5227                 :          0 :                         ap->idle_match = 0;
    5228                 :          0 :                         ap->ack_match = 0;
    5229                 :            : 
    5230                 :          0 :                         ap->state = ANEG_STATE_RESTART_INIT;
    5231                 :            :                 } else {
    5232                 :          0 :                         ap->state = ANEG_STATE_DISABLE_LINK_OK;
    5233                 :            :                 }
    5234                 :            :                 break;
    5235                 :            : 
    5236                 :          0 :         case ANEG_STATE_RESTART_INIT:
    5237                 :          0 :                 ap->link_time = ap->cur_time;
    5238                 :          0 :                 ap->flags &= ~(MR_NP_LOADED);
    5239                 :          0 :                 ap->txconfig = 0;
    5240                 :          0 :                 tw32(MAC_TX_AUTO_NEG, 0);
    5241                 :          0 :                 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
    5242                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    5243                 :          0 :                 udelay(40);
    5244                 :            : 
    5245                 :          0 :                 ret = ANEG_TIMER_ENAB;
    5246                 :          0 :                 ap->state = ANEG_STATE_RESTART;
    5247                 :            : 
    5248                 :            :                 /* fall through */
    5249                 :          0 :         case ANEG_STATE_RESTART:
    5250                 :          0 :                 delta = ap->cur_time - ap->link_time;
    5251         [ #  # ]:          0 :                 if (delta > ANEG_STATE_SETTLE_TIME)
    5252                 :          0 :                         ap->state = ANEG_STATE_ABILITY_DETECT_INIT;
    5253                 :            :                 else
    5254                 :            :                         ret = ANEG_TIMER_ENAB;
    5255                 :            :                 break;
    5256                 :            : 
    5257                 :          0 :         case ANEG_STATE_DISABLE_LINK_OK:
    5258                 :          0 :                 ret = ANEG_DONE;
    5259                 :          0 :                 break;
    5260                 :            : 
    5261                 :          0 :         case ANEG_STATE_ABILITY_DETECT_INIT:
    5262                 :          0 :                 ap->flags &= ~(MR_TOGGLE_TX);
    5263                 :          0 :                 ap->txconfig = ANEG_CFG_FD;
    5264         [ #  # ]:          0 :                 flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl);
    5265         [ #  # ]:          0 :                 if (flowctrl & ADVERTISE_1000XPAUSE)
    5266                 :          0 :                         ap->txconfig |= ANEG_CFG_PS1;
    5267         [ #  # ]:          0 :                 if (flowctrl & ADVERTISE_1000XPSE_ASYM)
    5268                 :          0 :                         ap->txconfig |= ANEG_CFG_PS2;
    5269                 :          0 :                 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
    5270                 :          0 :                 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
    5271                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    5272                 :          0 :                 udelay(40);
    5273                 :            : 
    5274                 :          0 :                 ap->state = ANEG_STATE_ABILITY_DETECT;
    5275                 :          0 :                 break;
    5276                 :            : 
    5277                 :          0 :         case ANEG_STATE_ABILITY_DETECT:
    5278   [ #  #  #  # ]:          0 :                 if (ap->ability_match != 0 && ap->rxconfig != 0)
    5279                 :          0 :                         ap->state = ANEG_STATE_ACK_DETECT_INIT;
    5280                 :            :                 break;
    5281                 :            : 
    5282                 :          0 :         case ANEG_STATE_ACK_DETECT_INIT:
    5283                 :          0 :                 ap->txconfig |= ANEG_CFG_ACK;
    5284                 :          0 :                 tw32(MAC_TX_AUTO_NEG, ap->txconfig);
    5285                 :          0 :                 tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
    5286                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    5287                 :          0 :                 udelay(40);
    5288                 :            : 
    5289                 :          0 :                 ap->state = ANEG_STATE_ACK_DETECT;
    5290                 :            : 
    5291                 :            :                 /* fall through */
    5292                 :          0 :         case ANEG_STATE_ACK_DETECT:
    5293         [ #  # ]:          0 :                 if (ap->ack_match != 0) {
    5294                 :          0 :                         if ((ap->rxconfig & ~ANEG_CFG_ACK) ==
    5295         [ #  # ]:          0 :                             (ap->ability_match_cfg & ~ANEG_CFG_ACK)) {
    5296                 :          0 :                                 ap->state = ANEG_STATE_COMPLETE_ACK_INIT;
    5297                 :            :                         } else {
    5298                 :          0 :                                 ap->state = ANEG_STATE_AN_ENABLE;
    5299                 :            :                         }
    5300         [ #  # ]:          0 :                 } else if (ap->ability_match != 0 &&
    5301         [ #  # ]:          0 :                            ap->rxconfig == 0) {
    5302                 :          0 :                         ap->state = ANEG_STATE_AN_ENABLE;
    5303                 :            :                 }
    5304                 :            :                 break;
    5305                 :            : 
    5306                 :          0 :         case ANEG_STATE_COMPLETE_ACK_INIT:
    5307         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_INVAL) {
    5308                 :            :                         ret = ANEG_FAILED;
    5309                 :            :                         break;
    5310                 :            :                 }
    5311                 :          0 :                 ap->flags &= ~(MR_LP_ADV_FULL_DUPLEX |
    5312                 :            :                                MR_LP_ADV_HALF_DUPLEX |
    5313                 :            :                                MR_LP_ADV_SYM_PAUSE |
    5314                 :            :                                MR_LP_ADV_ASYM_PAUSE |
    5315                 :            :                                MR_LP_ADV_REMOTE_FAULT1 |
    5316                 :            :                                MR_LP_ADV_REMOTE_FAULT2 |
    5317                 :            :                                MR_LP_ADV_NEXT_PAGE |
    5318                 :            :                                MR_TOGGLE_RX |
    5319                 :            :                                MR_NP_RX);
    5320         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_FD)
    5321                 :          0 :                         ap->flags |= MR_LP_ADV_FULL_DUPLEX;
    5322         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_HD)
    5323                 :          0 :                         ap->flags |= MR_LP_ADV_HALF_DUPLEX;
    5324         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_PS1)
    5325                 :          0 :                         ap->flags |= MR_LP_ADV_SYM_PAUSE;
    5326         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_PS2)
    5327                 :          0 :                         ap->flags |= MR_LP_ADV_ASYM_PAUSE;
    5328         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_RF1)
    5329                 :          0 :                         ap->flags |= MR_LP_ADV_REMOTE_FAULT1;
    5330         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_RF2)
    5331                 :          0 :                         ap->flags |= MR_LP_ADV_REMOTE_FAULT2;
    5332         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_NP)
    5333                 :          0 :                         ap->flags |= MR_LP_ADV_NEXT_PAGE;
    5334                 :            : 
    5335                 :          0 :                 ap->link_time = ap->cur_time;
    5336                 :            : 
    5337                 :          0 :                 ap->flags ^= (MR_TOGGLE_TX);
    5338         [ #  # ]:          0 :                 if (ap->rxconfig & 0x0008)
    5339                 :          0 :                         ap->flags |= MR_TOGGLE_RX;
    5340         [ #  # ]:          0 :                 if (ap->rxconfig & ANEG_CFG_NP)
    5341                 :          0 :                         ap->flags |= MR_NP_RX;
    5342                 :          0 :                 ap->flags |= MR_PAGE_RX;
    5343                 :            : 
    5344                 :          0 :                 ap->state = ANEG_STATE_COMPLETE_ACK;
    5345                 :          0 :                 ret = ANEG_TIMER_ENAB;
    5346                 :          0 :                 break;
    5347                 :            : 
    5348                 :          0 :         case ANEG_STATE_COMPLETE_ACK:
    5349   [ #  #  #  # ]:          0 :                 if (ap->ability_match != 0 &&
    5350                 :            :                     ap->rxconfig == 0) {
    5351                 :          0 :                         ap->state = ANEG_STATE_AN_ENABLE;
    5352                 :          0 :                         break;
    5353                 :            :                 }
    5354                 :          0 :                 delta = ap->cur_time - ap->link_time;
    5355         [ #  # ]:          0 :                 if (delta > ANEG_STATE_SETTLE_TIME) {
    5356         [ #  # ]:          0 :                         if (!(ap->flags & (MR_LP_ADV_NEXT_PAGE))) {
    5357                 :          0 :                                 ap->state = ANEG_STATE_IDLE_DETECT_INIT;
    5358                 :            :                         } else {
    5359         [ #  # ]:          0 :                                 if ((ap->txconfig & ANEG_CFG_NP) == 0 &&
    5360         [ #  # ]:          0 :                                     !(ap->flags & MR_NP_RX)) {
    5361                 :          0 :                                         ap->state = ANEG_STATE_IDLE_DETECT_INIT;
    5362                 :            :                                 } else {
    5363                 :            :                                         ret = ANEG_FAILED;
    5364                 :            :                                 }
    5365                 :            :                         }
    5366                 :            :                 }
    5367                 :            :                 break;
    5368                 :            : 
    5369                 :          0 :         case ANEG_STATE_IDLE_DETECT_INIT:
    5370                 :          0 :                 ap->link_time = ap->cur_time;
    5371                 :          0 :                 tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
    5372                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    5373                 :          0 :                 udelay(40);
    5374                 :            : 
    5375                 :          0 :                 ap->state = ANEG_STATE_IDLE_DETECT;
    5376                 :          0 :                 ret = ANEG_TIMER_ENAB;
    5377                 :          0 :                 break;
    5378                 :            : 
    5379                 :          0 :         case ANEG_STATE_IDLE_DETECT:
    5380   [ #  #  #  # ]:          0 :                 if (ap->ability_match != 0 &&
    5381                 :            :                     ap->rxconfig == 0) {
    5382                 :          0 :                         ap->state = ANEG_STATE_AN_ENABLE;
    5383                 :          0 :                         break;
    5384                 :            :                 }
    5385                 :          0 :                 delta = ap->cur_time - ap->link_time;
    5386         [ #  # ]:          0 :                 if (delta > ANEG_STATE_SETTLE_TIME) {
    5387                 :            :                         /* XXX another gem from the Broadcom driver :( */
    5388                 :          0 :                         ap->state = ANEG_STATE_LINK_OK;
    5389                 :            :                 }
    5390                 :            :                 break;
    5391                 :            : 
    5392                 :          0 :         case ANEG_STATE_LINK_OK:
    5393                 :          0 :                 ap->flags |= (MR_AN_COMPLETE | MR_LINK_OK);
    5394                 :          0 :                 ret = ANEG_DONE;
    5395                 :          0 :                 break;
    5396                 :            : 
    5397                 :            :         case ANEG_STATE_NEXT_PAGE_WAIT_INIT:
    5398                 :            :                 /* ??? unimplemented */
    5399                 :            :                 break;
    5400                 :            : 
    5401                 :            :         case ANEG_STATE_NEXT_PAGE_WAIT:
    5402                 :            :                 /* ??? unimplemented */
    5403                 :            :                 break;
    5404                 :            : 
    5405                 :          0 :         default:
    5406                 :          0 :                 ret = ANEG_FAILED;
    5407                 :          0 :                 break;
    5408                 :            :         }
    5409                 :            : 
    5410                 :          0 :         return ret;
    5411                 :            : }
    5412                 :            : 
    5413                 :          0 : static int fiber_autoneg(struct tg3 *tp, u32 *txflags, u32 *rxflags)
    5414                 :            : {
    5415                 :          0 :         int res = 0;
    5416                 :          0 :         struct tg3_fiber_aneginfo aninfo;
    5417                 :          0 :         int status = ANEG_FAILED;
    5418                 :          0 :         unsigned int tick;
    5419                 :          0 :         u32 tmp;
    5420                 :            : 
    5421                 :          0 :         tw32_f(MAC_TX_AUTO_NEG, 0);
    5422                 :            : 
    5423                 :          0 :         tmp = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK;
    5424                 :          0 :         tw32_f(MAC_MODE, tmp | MAC_MODE_PORT_MODE_GMII);
    5425                 :          0 :         udelay(40);
    5426                 :            : 
    5427                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_SEND_CONFIGS);
    5428                 :          0 :         udelay(40);
    5429                 :            : 
    5430                 :          0 :         memset(&aninfo, 0, sizeof(aninfo));
    5431                 :          0 :         aninfo.flags |= MR_AN_ENABLE;
    5432                 :          0 :         aninfo.state = ANEG_STATE_UNKNOWN;
    5433                 :          0 :         aninfo.cur_time = 0;
    5434                 :          0 :         tick = 0;
    5435         [ #  # ]:          0 :         while (++tick < 195000) {
    5436                 :          0 :                 status = tg3_fiber_aneg_smachine(tp, &aninfo);
    5437         [ #  # ]:          0 :                 if (status == ANEG_DONE || status == ANEG_FAILED)
    5438                 :            :                         break;
    5439                 :            : 
    5440                 :          0 :                 udelay(1);
    5441                 :            :         }
    5442                 :            : 
    5443                 :          0 :         tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
    5444                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode);
    5445                 :          0 :         udelay(40);
    5446                 :            : 
    5447                 :          0 :         *txflags = aninfo.txconfig;
    5448                 :          0 :         *rxflags = aninfo.flags;
    5449                 :            : 
    5450         [ #  # ]:          0 :         if (status == ANEG_DONE &&
    5451         [ #  # ]:          0 :             (aninfo.flags & (MR_AN_COMPLETE | MR_LINK_OK |
    5452                 :            :                              MR_LP_ADV_FULL_DUPLEX)))
    5453                 :          0 :                 res = 1;
    5454                 :            : 
    5455                 :          0 :         return res;
    5456                 :            : }
    5457                 :            : 
    5458                 :          0 : static void tg3_init_bcm8002(struct tg3 *tp)
    5459                 :            : {
    5460                 :          0 :         u32 mac_status = tr32(MAC_STATUS);
    5461                 :          0 :         int i;
    5462                 :            : 
    5463                 :            :         /* Reset when initting first time or we have a link. */
    5464         [ #  # ]:          0 :         if (tg3_flag(tp, INIT_COMPLETE) &&
    5465         [ #  # ]:          0 :             !(mac_status & MAC_STATUS_PCS_SYNCED))
    5466                 :            :                 return;
    5467                 :            : 
    5468                 :            :         /* Set PLL lock range. */
    5469                 :          0 :         tg3_writephy(tp, 0x16, 0x8007);
    5470                 :            : 
    5471                 :            :         /* SW reset */
    5472                 :          0 :         tg3_writephy(tp, MII_BMCR, BMCR_RESET);
    5473                 :            : 
    5474                 :            :         /* Wait for reset to complete. */
    5475                 :            :         /* XXX schedule_timeout() ... */
    5476         [ #  # ]:          0 :         for (i = 0; i < 500; i++)
    5477                 :          0 :                 udelay(10);
    5478                 :            : 
    5479                 :            :         /* Config mode; select PMA/Ch 1 regs. */
    5480                 :          0 :         tg3_writephy(tp, 0x10, 0x8411);
    5481                 :            : 
    5482                 :            :         /* Enable auto-lock and comdet, select txclk for tx. */
    5483                 :          0 :         tg3_writephy(tp, 0x11, 0x0a10);
    5484                 :            : 
    5485                 :          0 :         tg3_writephy(tp, 0x18, 0x00a0);
    5486                 :          0 :         tg3_writephy(tp, 0x16, 0x41ff);
    5487                 :            : 
    5488                 :            :         /* Assert and deassert POR. */
    5489                 :          0 :         tg3_writephy(tp, 0x13, 0x0400);
    5490                 :          0 :         udelay(40);
    5491                 :          0 :         tg3_writephy(tp, 0x13, 0x0000);
    5492                 :            : 
    5493                 :          0 :         tg3_writephy(tp, 0x11, 0x0a50);
    5494                 :          0 :         udelay(40);
    5495                 :          0 :         tg3_writephy(tp, 0x11, 0x0a10);
    5496                 :            : 
    5497                 :            :         /* Wait for signal to stabilize */
    5498                 :            :         /* XXX schedule_timeout() ... */
    5499         [ #  # ]:          0 :         for (i = 0; i < 15000; i++)
    5500                 :          0 :                 udelay(10);
    5501                 :            : 
    5502                 :            :         /* Deselect the channel register so we can read the PHYID
    5503                 :            :          * later.
    5504                 :            :          */
    5505                 :          0 :         tg3_writephy(tp, 0x10, 0x8011);
    5506                 :            : }
    5507                 :            : 
    5508                 :          0 : static bool tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
    5509                 :            : {
    5510                 :          0 :         u16 flowctrl;
    5511                 :          0 :         bool current_link_up;
    5512                 :          0 :         u32 sg_dig_ctrl, sg_dig_status;
    5513                 :          0 :         u32 serdes_cfg, expected_sg_dig_ctrl;
    5514                 :          0 :         int workaround, port_a;
    5515                 :            : 
    5516                 :          0 :         serdes_cfg = 0;
    5517                 :          0 :         expected_sg_dig_ctrl = 0;
    5518                 :          0 :         workaround = 0;
    5519                 :          0 :         port_a = 1;
    5520                 :          0 :         current_link_up = false;
    5521                 :            : 
    5522         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) != CHIPREV_ID_5704_A0 &&
    5523                 :            :             tg3_chip_rev_id(tp) != CHIPREV_ID_5704_A1) {
    5524                 :          0 :                 workaround = 1;
    5525         [ #  # ]:          0 :                 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
    5526                 :          0 :                         port_a = 0;
    5527                 :            : 
    5528                 :            :                 /* preserve bits 0-11,13,14 for signal pre-emphasis */
    5529                 :            :                 /* preserve bits 20-23 for voltage regulator */
    5530                 :          0 :                 serdes_cfg = tr32(MAC_SERDES_CFG) & 0x00f06fff;
    5531                 :            :         }
    5532                 :            : 
    5533                 :          0 :         sg_dig_ctrl = tr32(SG_DIG_CTRL);
    5534                 :            : 
    5535         [ #  # ]:          0 :         if (tp->link_config.autoneg != AUTONEG_ENABLE) {
    5536         [ #  # ]:          0 :                 if (sg_dig_ctrl & SG_DIG_USING_HW_AUTONEG) {
    5537         [ #  # ]:          0 :                         if (workaround) {
    5538                 :          0 :                                 u32 val = serdes_cfg;
    5539                 :            : 
    5540         [ #  # ]:          0 :                                 if (port_a)
    5541                 :          0 :                                         val |= 0xc010000;
    5542                 :            :                                 else
    5543                 :          0 :                                         val |= 0x4010000;
    5544                 :          0 :                                 tw32_f(MAC_SERDES_CFG, val);
    5545                 :            :                         }
    5546                 :            : 
    5547                 :          0 :                         tw32_f(SG_DIG_CTRL, SG_DIG_COMMON_SETUP);
    5548                 :            :                 }
    5549         [ #  # ]:          0 :                 if (mac_status & MAC_STATUS_PCS_SYNCED) {
    5550                 :          0 :                         tg3_setup_flow_control(tp, 0, 0);
    5551                 :          0 :                         current_link_up = true;
    5552                 :            :                 }
    5553                 :          0 :                 goto out;
    5554                 :            :         }
    5555                 :            : 
    5556                 :            :         /* Want auto-negotiation.  */
    5557                 :          0 :         expected_sg_dig_ctrl = SG_DIG_USING_HW_AUTONEG | SG_DIG_COMMON_SETUP;
    5558                 :            : 
    5559         [ #  # ]:          0 :         flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl);
    5560         [ #  # ]:          0 :         if (flowctrl & ADVERTISE_1000XPAUSE)
    5561                 :          0 :                 expected_sg_dig_ctrl |= SG_DIG_PAUSE_CAP;
    5562         [ #  # ]:          0 :         if (flowctrl & ADVERTISE_1000XPSE_ASYM)
    5563                 :          0 :                 expected_sg_dig_ctrl |= SG_DIG_ASYM_PAUSE;
    5564                 :            : 
    5565         [ #  # ]:          0 :         if (sg_dig_ctrl != expected_sg_dig_ctrl) {
    5566         [ #  # ]:          0 :                 if ((tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT) &&
    5567         [ #  # ]:          0 :                     tp->serdes_counter &&
    5568         [ #  # ]:          0 :                     ((mac_status & (MAC_STATUS_PCS_SYNCED |
    5569                 :            :                                     MAC_STATUS_RCVD_CFG)) ==
    5570                 :            :                      MAC_STATUS_PCS_SYNCED)) {
    5571                 :          0 :                         tp->serdes_counter--;
    5572                 :          0 :                         current_link_up = true;
    5573                 :          0 :                         goto out;
    5574                 :            :                 }
    5575                 :          0 : restart_autoneg:
    5576         [ #  # ]:          0 :                 if (workaround)
    5577                 :          0 :                         tw32_f(MAC_SERDES_CFG, serdes_cfg | 0xc011000);
    5578                 :          0 :                 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl | SG_DIG_SOFT_RESET);
    5579                 :          0 :                 udelay(5);
    5580                 :          0 :                 tw32_f(SG_DIG_CTRL, expected_sg_dig_ctrl);
    5581                 :            : 
    5582                 :          0 :                 tp->serdes_counter = SERDES_AN_TIMEOUT_5704S;
    5583                 :          0 :                 tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    5584         [ #  # ]:          0 :         } else if (mac_status & (MAC_STATUS_PCS_SYNCED |
    5585                 :            :                                  MAC_STATUS_SIGNAL_DET)) {
    5586                 :          0 :                 sg_dig_status = tr32(SG_DIG_STATUS);
    5587                 :          0 :                 mac_status = tr32(MAC_STATUS);
    5588                 :            : 
    5589         [ #  # ]:          0 :                 if ((sg_dig_status & SG_DIG_AUTONEG_COMPLETE) &&
    5590         [ #  # ]:          0 :                     (mac_status & MAC_STATUS_PCS_SYNCED)) {
    5591                 :          0 :                         u32 local_adv = 0, remote_adv = 0;
    5592                 :            : 
    5593         [ #  # ]:          0 :                         if (sg_dig_ctrl & SG_DIG_PAUSE_CAP)
    5594                 :          0 :                                 local_adv |= ADVERTISE_1000XPAUSE;
    5595         [ #  # ]:          0 :                         if (sg_dig_ctrl & SG_DIG_ASYM_PAUSE)
    5596                 :          0 :                                 local_adv |= ADVERTISE_1000XPSE_ASYM;
    5597                 :            : 
    5598         [ #  # ]:          0 :                         if (sg_dig_status & SG_DIG_PARTNER_PAUSE_CAPABLE)
    5599                 :          0 :                                 remote_adv |= LPA_1000XPAUSE;
    5600         [ #  # ]:          0 :                         if (sg_dig_status & SG_DIG_PARTNER_ASYM_PAUSE)
    5601                 :          0 :                                 remote_adv |= LPA_1000XPAUSE_ASYM;
    5602                 :            : 
    5603         [ #  # ]:          0 :                         tp->link_config.rmt_adv =
    5604                 :            :                                            mii_adv_to_ethtool_adv_x(remote_adv);
    5605                 :            : 
    5606                 :          0 :                         tg3_setup_flow_control(tp, local_adv, remote_adv);
    5607                 :          0 :                         current_link_up = true;
    5608                 :          0 :                         tp->serdes_counter = 0;
    5609                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    5610         [ #  # ]:          0 :                 } else if (!(sg_dig_status & SG_DIG_AUTONEG_COMPLETE)) {
    5611         [ #  # ]:          0 :                         if (tp->serdes_counter)
    5612                 :          0 :                                 tp->serdes_counter--;
    5613                 :            :                         else {
    5614         [ #  # ]:          0 :                                 if (workaround) {
    5615                 :          0 :                                         u32 val = serdes_cfg;
    5616                 :            : 
    5617         [ #  # ]:          0 :                                         if (port_a)
    5618                 :          0 :                                                 val |= 0xc010000;
    5619                 :            :                                         else
    5620                 :          0 :                                                 val |= 0x4010000;
    5621                 :            : 
    5622                 :          0 :                                         tw32_f(MAC_SERDES_CFG, val);
    5623                 :            :                                 }
    5624                 :            : 
    5625                 :          0 :                                 tw32_f(SG_DIG_CTRL, SG_DIG_COMMON_SETUP);
    5626                 :          0 :                                 udelay(40);
    5627                 :            : 
    5628                 :            :                                 /* Link parallel detection - link is up */
    5629                 :            :                                 /* only if we have PCS_SYNC and not */
    5630                 :            :                                 /* receiving config code words */
    5631                 :          0 :                                 mac_status = tr32(MAC_STATUS);
    5632         [ #  # ]:          0 :                                 if ((mac_status & MAC_STATUS_PCS_SYNCED) &&
    5633                 :            :                                     !(mac_status & MAC_STATUS_RCVD_CFG)) {
    5634                 :          0 :                                         tg3_setup_flow_control(tp, 0, 0);
    5635                 :          0 :                                         current_link_up = true;
    5636                 :          0 :                                         tp->phy_flags |=
    5637                 :            :                                                 TG3_PHYFLG_PARALLEL_DETECT;
    5638                 :          0 :                                         tp->serdes_counter =
    5639                 :            :                                                 SERDES_PARALLEL_DET_TIMEOUT;
    5640                 :            :                                 } else
    5641                 :          0 :                                         goto restart_autoneg;
    5642                 :            :                         }
    5643                 :            :                 }
    5644                 :            :         } else {
    5645                 :          0 :                 tp->serdes_counter = SERDES_AN_TIMEOUT_5704S;
    5646                 :          0 :                 tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    5647                 :            :         }
    5648                 :            : 
    5649                 :          0 : out:
    5650                 :          0 :         return current_link_up;
    5651                 :            : }
    5652                 :            : 
    5653                 :          0 : static bool tg3_setup_fiber_by_hand(struct tg3 *tp, u32 mac_status)
    5654                 :            : {
    5655                 :          0 :         bool current_link_up = false;
    5656                 :            : 
    5657         [ #  # ]:          0 :         if (!(mac_status & MAC_STATUS_PCS_SYNCED))
    5658                 :          0 :                 goto out;
    5659                 :            : 
    5660         [ #  # ]:          0 :         if (tp->link_config.autoneg == AUTONEG_ENABLE) {
    5661                 :          0 :                 u32 txflags, rxflags;
    5662                 :          0 :                 int i;
    5663                 :            : 
    5664         [ #  # ]:          0 :                 if (fiber_autoneg(tp, &txflags, &rxflags)) {
    5665                 :          0 :                         u32 local_adv = 0, remote_adv = 0;
    5666                 :            : 
    5667         [ #  # ]:          0 :                         if (txflags & ANEG_CFG_PS1)
    5668                 :          0 :                                 local_adv |= ADVERTISE_1000XPAUSE;
    5669         [ #  # ]:          0 :                         if (txflags & ANEG_CFG_PS2)
    5670                 :          0 :                                 local_adv |= ADVERTISE_1000XPSE_ASYM;
    5671                 :            : 
    5672         [ #  # ]:          0 :                         if (rxflags & MR_LP_ADV_SYM_PAUSE)
    5673                 :          0 :                                 remote_adv |= LPA_1000XPAUSE;
    5674         [ #  # ]:          0 :                         if (rxflags & MR_LP_ADV_ASYM_PAUSE)
    5675                 :          0 :                                 remote_adv |= LPA_1000XPAUSE_ASYM;
    5676                 :            : 
    5677         [ #  # ]:          0 :                         tp->link_config.rmt_adv =
    5678                 :            :                                            mii_adv_to_ethtool_adv_x(remote_adv);
    5679                 :            : 
    5680                 :          0 :                         tg3_setup_flow_control(tp, local_adv, remote_adv);
    5681                 :            : 
    5682                 :          0 :                         current_link_up = true;
    5683                 :            :                 }
    5684         [ #  # ]:          0 :                 for (i = 0; i < 30; i++) {
    5685                 :          0 :                         udelay(20);
    5686                 :          0 :                         tw32_f(MAC_STATUS,
    5687                 :            :                                (MAC_STATUS_SYNC_CHANGED |
    5688                 :            :                                 MAC_STATUS_CFG_CHANGED));
    5689                 :          0 :                         udelay(40);
    5690         [ #  # ]:          0 :                         if ((tr32(MAC_STATUS) &
    5691                 :            :                              (MAC_STATUS_SYNC_CHANGED |
    5692                 :            :                               MAC_STATUS_CFG_CHANGED)) == 0)
    5693                 :            :                                 break;
    5694                 :            :                 }
    5695                 :            : 
    5696                 :          0 :                 mac_status = tr32(MAC_STATUS);
    5697         [ #  # ]:          0 :                 if (!current_link_up &&
    5698         [ #  # ]:          0 :                     (mac_status & MAC_STATUS_PCS_SYNCED) &&
    5699                 :            :                     !(mac_status & MAC_STATUS_RCVD_CFG))
    5700                 :          0 :                         current_link_up = true;
    5701                 :            :         } else {
    5702                 :          0 :                 tg3_setup_flow_control(tp, 0, 0);
    5703                 :            : 
    5704                 :            :                 /* Forcing 1000FD link up. */
    5705                 :          0 :                 current_link_up = true;
    5706                 :            : 
    5707                 :          0 :                 tw32_f(MAC_MODE, (tp->mac_mode | MAC_MODE_SEND_CONFIGS));
    5708                 :          0 :                 udelay(40);
    5709                 :            : 
    5710                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    5711                 :          0 :                 udelay(40);
    5712                 :            :         }
    5713                 :            : 
    5714                 :          0 : out:
    5715                 :          0 :         return current_link_up;
    5716                 :            : }
    5717                 :            : 
    5718                 :          0 : static int tg3_setup_fiber_phy(struct tg3 *tp, bool force_reset)
    5719                 :            : {
    5720                 :          0 :         u32 orig_pause_cfg;
    5721                 :          0 :         u32 orig_active_speed;
    5722                 :          0 :         u8 orig_active_duplex;
    5723                 :          0 :         u32 mac_status;
    5724                 :          0 :         bool current_link_up;
    5725                 :          0 :         int i;
    5726                 :            : 
    5727                 :          0 :         orig_pause_cfg = tp->link_config.active_flowctrl;
    5728                 :          0 :         orig_active_speed = tp->link_config.active_speed;
    5729                 :          0 :         orig_active_duplex = tp->link_config.active_duplex;
    5730                 :            : 
    5731         [ #  # ]:          0 :         if (!tg3_flag(tp, HW_AUTONEG) &&
    5732   [ #  #  #  # ]:          0 :             tp->link_up &&
    5733                 :            :             tg3_flag(tp, INIT_COMPLETE)) {
    5734                 :          0 :                 mac_status = tr32(MAC_STATUS);
    5735                 :          0 :                 mac_status &= (MAC_STATUS_PCS_SYNCED |
    5736                 :            :                                MAC_STATUS_SIGNAL_DET |
    5737                 :            :                                MAC_STATUS_CFG_CHANGED |
    5738                 :            :                                MAC_STATUS_RCVD_CFG);
    5739         [ #  # ]:          0 :                 if (mac_status == (MAC_STATUS_PCS_SYNCED |
    5740                 :            :                                    MAC_STATUS_SIGNAL_DET)) {
    5741                 :          0 :                         tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
    5742                 :            :                                             MAC_STATUS_CFG_CHANGED));
    5743                 :          0 :                         return 0;
    5744                 :            :                 }
    5745                 :            :         }
    5746                 :            : 
    5747                 :          0 :         tw32_f(MAC_TX_AUTO_NEG, 0);
    5748                 :            : 
    5749                 :          0 :         tp->mac_mode &= ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX);
    5750                 :          0 :         tp->mac_mode |= MAC_MODE_PORT_MODE_TBI;
    5751                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode);
    5752                 :          0 :         udelay(40);
    5753                 :            : 
    5754         [ #  # ]:          0 :         if (tp->phy_id == TG3_PHY_ID_BCM8002)
    5755                 :          0 :                 tg3_init_bcm8002(tp);
    5756                 :            : 
    5757                 :            :         /* Enable link change event even when serdes polling.  */
    5758                 :          0 :         tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
    5759                 :          0 :         udelay(40);
    5760                 :            : 
    5761                 :          0 :         current_link_up = false;
    5762                 :          0 :         tp->link_config.rmt_adv = 0;
    5763                 :          0 :         mac_status = tr32(MAC_STATUS);
    5764                 :            : 
    5765         [ #  # ]:          0 :         if (tg3_flag(tp, HW_AUTONEG))
    5766                 :          0 :                 current_link_up = tg3_setup_fiber_hw_autoneg(tp, mac_status);
    5767                 :            :         else
    5768                 :          0 :                 current_link_up = tg3_setup_fiber_by_hand(tp, mac_status);
    5769                 :            : 
    5770                 :          0 :         tp->napi[0].hw_status->status =
    5771                 :          0 :                 (SD_STATUS_UPDATED |
    5772                 :          0 :                  (tp->napi[0].hw_status->status & ~SD_STATUS_LINK_CHG));
    5773                 :            : 
    5774         [ #  # ]:          0 :         for (i = 0; i < 100; i++) {
    5775                 :          0 :                 tw32_f(MAC_STATUS, (MAC_STATUS_SYNC_CHANGED |
    5776                 :            :                                     MAC_STATUS_CFG_CHANGED));
    5777                 :          0 :                 udelay(5);
    5778         [ #  # ]:          0 :                 if ((tr32(MAC_STATUS) & (MAC_STATUS_SYNC_CHANGED |
    5779                 :            :                                          MAC_STATUS_CFG_CHANGED |
    5780                 :            :                                          MAC_STATUS_LNKSTATE_CHANGED)) == 0)
    5781                 :            :                         break;
    5782                 :            :         }
    5783                 :            : 
    5784                 :          0 :         mac_status = tr32(MAC_STATUS);
    5785         [ #  # ]:          0 :         if ((mac_status & MAC_STATUS_PCS_SYNCED) == 0) {
    5786                 :          0 :                 current_link_up = false;
    5787         [ #  # ]:          0 :                 if (tp->link_config.autoneg == AUTONEG_ENABLE &&
    5788         [ #  # ]:          0 :                     tp->serdes_counter == 0) {
    5789                 :          0 :                         tw32_f(MAC_MODE, (tp->mac_mode |
    5790                 :            :                                           MAC_MODE_SEND_CONFIGS));
    5791                 :          0 :                         udelay(1);
    5792                 :          0 :                         tw32_f(MAC_MODE, tp->mac_mode);
    5793                 :            :                 }
    5794                 :            :         }
    5795                 :            : 
    5796         [ #  # ]:          0 :         if (current_link_up) {
    5797                 :          0 :                 tp->link_config.active_speed = SPEED_1000;
    5798                 :          0 :                 tp->link_config.active_duplex = DUPLEX_FULL;
    5799                 :          0 :                 tw32(MAC_LED_CTRL, (tp->led_ctrl |
    5800                 :            :                                     LED_CTRL_LNKLED_OVERRIDE |
    5801                 :            :                                     LED_CTRL_1000MBPS_ON));
    5802                 :            :         } else {
    5803                 :          0 :                 tp->link_config.active_speed = SPEED_UNKNOWN;
    5804                 :          0 :                 tp->link_config.active_duplex = DUPLEX_UNKNOWN;
    5805                 :          0 :                 tw32(MAC_LED_CTRL, (tp->led_ctrl |
    5806                 :            :                                     LED_CTRL_LNKLED_OVERRIDE |
    5807                 :            :                                     LED_CTRL_TRAFFIC_OVERRIDE));
    5808                 :            :         }
    5809                 :            : 
    5810         [ #  # ]:          0 :         if (!tg3_test_and_report_link_chg(tp, current_link_up)) {
    5811                 :          0 :                 u32 now_pause_cfg = tp->link_config.active_flowctrl;
    5812         [ #  # ]:          0 :                 if (orig_pause_cfg != now_pause_cfg ||
    5813         [ #  # ]:          0 :                     orig_active_speed != tp->link_config.active_speed ||
    5814         [ #  # ]:          0 :                     orig_active_duplex != tp->link_config.active_duplex)
    5815                 :          0 :                         tg3_link_report(tp);
    5816                 :            :         }
    5817                 :            : 
    5818                 :            :         return 0;
    5819                 :            : }
    5820                 :            : 
    5821                 :          0 : static int tg3_setup_fiber_mii_phy(struct tg3 *tp, bool force_reset)
    5822                 :            : {
    5823                 :          0 :         int err = 0;
    5824                 :          0 :         u32 bmsr, bmcr;
    5825                 :          0 :         u32 current_speed = SPEED_UNKNOWN;
    5826                 :          0 :         u8 current_duplex = DUPLEX_UNKNOWN;
    5827                 :          0 :         bool current_link_up = false;
    5828                 :          0 :         u32 local_adv, remote_adv, sgsr;
    5829                 :            : 
    5830         [ #  # ]:          0 :         if ((tg3_asic_rev(tp) == ASIC_REV_5719 ||
    5831         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_5720) &&
    5832                 :          0 :              !tg3_readphy(tp, SERDES_TG3_1000X_STATUS, &sgsr) &&
    5833         [ #  # ]:          0 :              (sgsr & SERDES_TG3_SGMII_MODE)) {
    5834                 :            : 
    5835         [ #  # ]:          0 :                 if (force_reset)
    5836                 :          0 :                         tg3_phy_reset(tp);
    5837                 :            : 
    5838                 :          0 :                 tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
    5839                 :            : 
    5840         [ #  # ]:          0 :                 if (!(sgsr & SERDES_TG3_LINK_UP)) {
    5841                 :          0 :                         tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
    5842                 :            :                 } else {
    5843                 :          0 :                         current_link_up = true;
    5844         [ #  # ]:          0 :                         if (sgsr & SERDES_TG3_SPEED_1000) {
    5845                 :          0 :                                 current_speed = SPEED_1000;
    5846                 :          0 :                                 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
    5847         [ #  # ]:          0 :                         } else if (sgsr & SERDES_TG3_SPEED_100) {
    5848                 :          0 :                                 current_speed = SPEED_100;
    5849                 :          0 :                                 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
    5850                 :            :                         } else {
    5851                 :          0 :                                 current_speed = SPEED_10;
    5852                 :          0 :                                 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
    5853                 :            :                         }
    5854                 :            : 
    5855         [ #  # ]:          0 :                         if (sgsr & SERDES_TG3_FULL_DUPLEX)
    5856                 :            :                                 current_duplex = DUPLEX_FULL;
    5857                 :            :                         else
    5858                 :          0 :                                 current_duplex = DUPLEX_HALF;
    5859                 :            :                 }
    5860                 :            : 
    5861                 :          0 :                 tw32_f(MAC_MODE, tp->mac_mode);
    5862                 :          0 :                 udelay(40);
    5863                 :            : 
    5864                 :          0 :                 tg3_clear_mac_status(tp);
    5865                 :            : 
    5866                 :          0 :                 goto fiber_setup_done;
    5867                 :            :         }
    5868                 :            : 
    5869                 :          0 :         tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
    5870                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode);
    5871                 :          0 :         udelay(40);
    5872                 :            : 
    5873                 :          0 :         tg3_clear_mac_status(tp);
    5874                 :            : 
    5875         [ #  # ]:          0 :         if (force_reset)
    5876                 :          0 :                 tg3_phy_reset(tp);
    5877                 :            : 
    5878                 :          0 :         tp->link_config.rmt_adv = 0;
    5879                 :            : 
    5880                 :          0 :         err |= tg3_readphy(tp, MII_BMSR, &bmsr);
    5881                 :          0 :         err |= tg3_readphy(tp, MII_BMSR, &bmsr);
    5882         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5714) {
    5883         [ #  # ]:          0 :                 if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
    5884                 :          0 :                         bmsr |= BMSR_LSTATUS;
    5885                 :            :                 else
    5886                 :          0 :                         bmsr &= ~BMSR_LSTATUS;
    5887                 :            :         }
    5888                 :            : 
    5889                 :          0 :         err |= tg3_readphy(tp, MII_BMCR, &bmcr);
    5890                 :            : 
    5891   [ #  #  #  # ]:          0 :         if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset &&
    5892         [ #  # ]:          0 :             (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT)) {
    5893                 :            :                 /* do nothing, just check for link up at the end */
    5894         [ #  # ]:          0 :         } else if (tp->link_config.autoneg == AUTONEG_ENABLE) {
    5895                 :          0 :                 u32 adv, newadv;
    5896                 :            : 
    5897                 :          0 :                 err |= tg3_readphy(tp, MII_ADVERTISE, &adv);
    5898                 :          0 :                 newadv = adv & ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF |
    5899                 :            :                                  ADVERTISE_1000XPAUSE |
    5900                 :            :                                  ADVERTISE_1000XPSE_ASYM |
    5901                 :            :                                  ADVERTISE_SLCT);
    5902                 :            : 
    5903         [ #  # ]:          0 :                 newadv |= tg3_advert_flowctrl_1000X(tp->link_config.flowctrl);
    5904         [ #  # ]:          0 :                 newadv |= ethtool_adv_to_mii_adv_x(tp->link_config.advertising);
    5905                 :            : 
    5906   [ #  #  #  # ]:          0 :                 if ((newadv != adv) || !(bmcr & BMCR_ANENABLE)) {
    5907                 :          0 :                         tg3_writephy(tp, MII_ADVERTISE, newadv);
    5908                 :          0 :                         bmcr |= BMCR_ANENABLE | BMCR_ANRESTART;
    5909                 :          0 :                         tg3_writephy(tp, MII_BMCR, bmcr);
    5910                 :            : 
    5911                 :          0 :                         tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
    5912                 :          0 :                         tp->serdes_counter = SERDES_AN_TIMEOUT_5714S;
    5913                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    5914                 :            : 
    5915                 :          0 :                         return err;
    5916                 :            :                 }
    5917                 :            :         } else {
    5918                 :          0 :                 u32 new_bmcr;
    5919                 :            : 
    5920                 :          0 :                 bmcr &= ~BMCR_SPEED1000;
    5921                 :          0 :                 new_bmcr = bmcr & ~(BMCR_ANENABLE | BMCR_FULLDPLX);
    5922                 :            : 
    5923         [ #  # ]:          0 :                 if (tp->link_config.duplex == DUPLEX_FULL)
    5924                 :          0 :                         new_bmcr |= BMCR_FULLDPLX;
    5925                 :            : 
    5926         [ #  # ]:          0 :                 if (new_bmcr != bmcr) {
    5927                 :            :                         /* BMCR_SPEED1000 is a reserved bit that needs
    5928                 :            :                          * to be set on write.
    5929                 :            :                          */
    5930                 :          0 :                         new_bmcr |= BMCR_SPEED1000;
    5931                 :            : 
    5932                 :            :                         /* Force a linkdown */
    5933         [ #  # ]:          0 :                         if (tp->link_up) {
    5934                 :          0 :                                 u32 adv;
    5935                 :            : 
    5936                 :          0 :                                 err |= tg3_readphy(tp, MII_ADVERTISE, &adv);
    5937                 :          0 :                                 adv &= ~(ADVERTISE_1000XFULL |
    5938                 :            :                                          ADVERTISE_1000XHALF |
    5939                 :            :                                          ADVERTISE_SLCT);
    5940                 :          0 :                                 tg3_writephy(tp, MII_ADVERTISE, adv);
    5941                 :          0 :                                 tg3_writephy(tp, MII_BMCR, bmcr |
    5942                 :            :                                                            BMCR_ANRESTART |
    5943                 :            :                                                            BMCR_ANENABLE);
    5944                 :          0 :                                 udelay(10);
    5945                 :          0 :                                 tg3_carrier_off(tp);
    5946                 :            :                         }
    5947                 :          0 :                         tg3_writephy(tp, MII_BMCR, new_bmcr);
    5948                 :          0 :                         bmcr = new_bmcr;
    5949                 :          0 :                         err |= tg3_readphy(tp, MII_BMSR, &bmsr);
    5950                 :          0 :                         err |= tg3_readphy(tp, MII_BMSR, &bmsr);
    5951         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5714) {
    5952         [ #  # ]:          0 :                                 if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
    5953                 :          0 :                                         bmsr |= BMSR_LSTATUS;
    5954                 :            :                                 else
    5955                 :          0 :                                         bmsr &= ~BMSR_LSTATUS;
    5956                 :            :                         }
    5957                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    5958                 :            :                 }
    5959                 :            :         }
    5960                 :            : 
    5961         [ #  # ]:          0 :         if (bmsr & BMSR_LSTATUS) {
    5962                 :          0 :                 current_speed = SPEED_1000;
    5963                 :          0 :                 current_link_up = true;
    5964         [ #  # ]:          0 :                 if (bmcr & BMCR_FULLDPLX)
    5965                 :            :                         current_duplex = DUPLEX_FULL;
    5966                 :            :                 else
    5967                 :          0 :                         current_duplex = DUPLEX_HALF;
    5968                 :            : 
    5969                 :          0 :                 local_adv = 0;
    5970                 :          0 :                 remote_adv = 0;
    5971                 :            : 
    5972         [ #  # ]:          0 :                 if (bmcr & BMCR_ANENABLE) {
    5973                 :          0 :                         u32 common;
    5974                 :            : 
    5975                 :          0 :                         err |= tg3_readphy(tp, MII_ADVERTISE, &local_adv);
    5976                 :          0 :                         err |= tg3_readphy(tp, MII_LPA, &remote_adv);
    5977                 :          0 :                         common = local_adv & remote_adv;
    5978         [ #  # ]:          0 :                         if (common & (ADVERTISE_1000XHALF |
    5979                 :            :                                       ADVERTISE_1000XFULL)) {
    5980         [ #  # ]:          0 :                                 if (common & ADVERTISE_1000XFULL)
    5981                 :            :                                         current_duplex = DUPLEX_FULL;
    5982                 :            :                                 else
    5983                 :          0 :                                         current_duplex = DUPLEX_HALF;
    5984                 :            : 
    5985         [ #  # ]:          0 :                                 tp->link_config.rmt_adv =
    5986                 :            :                                            mii_adv_to_ethtool_adv_x(remote_adv);
    5987         [ #  # ]:          0 :                         } else if (!tg3_flag(tp, 5780_CLASS)) {
    5988                 :            :                                 /* Link is up via parallel detect */
    5989                 :            :                         } else {
    5990                 :          0 :                                 current_link_up = false;
    5991                 :            :                         }
    5992                 :            :                 }
    5993                 :            :         }
    5994                 :            : 
    5995                 :          0 : fiber_setup_done:
    5996         [ #  # ]:          0 :         if (current_link_up && current_duplex == DUPLEX_FULL)
    5997                 :          0 :                 tg3_setup_flow_control(tp, local_adv, remote_adv);
    5998                 :            : 
    5999                 :          0 :         tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
    6000         [ #  # ]:          0 :         if (tp->link_config.active_duplex == DUPLEX_HALF)
    6001                 :          0 :                 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
    6002                 :            : 
    6003                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode);
    6004                 :          0 :         udelay(40);
    6005                 :            : 
    6006                 :          0 :         tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
    6007                 :            : 
    6008                 :          0 :         tp->link_config.active_speed = current_speed;
    6009                 :          0 :         tp->link_config.active_duplex = current_duplex;
    6010                 :            : 
    6011                 :          0 :         tg3_test_and_report_link_chg(tp, current_link_up);
    6012                 :          0 :         return err;
    6013                 :            : }
    6014                 :            : 
    6015                 :          0 : static void tg3_serdes_parallel_detect(struct tg3 *tp)
    6016                 :            : {
    6017         [ #  # ]:          0 :         if (tp->serdes_counter) {
    6018                 :            :                 /* Give autoneg time to complete. */
    6019                 :          0 :                 tp->serdes_counter--;
    6020                 :          0 :                 return;
    6021                 :            :         }
    6022                 :            : 
    6023         [ #  # ]:          0 :         if (!tp->link_up &&
    6024         [ #  # ]:          0 :             (tp->link_config.autoneg == AUTONEG_ENABLE)) {
    6025                 :          0 :                 u32 bmcr;
    6026                 :            : 
    6027                 :          0 :                 tg3_readphy(tp, MII_BMCR, &bmcr);
    6028         [ #  # ]:          0 :                 if (bmcr & BMCR_ANENABLE) {
    6029                 :          0 :                         u32 phy1, phy2;
    6030                 :            : 
    6031                 :            :                         /* Select shadow register 0x1f */
    6032                 :          0 :                         tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x7c00);
    6033                 :          0 :                         tg3_readphy(tp, MII_TG3_MISC_SHDW, &phy1);
    6034                 :            : 
    6035                 :            :                         /* Select expansion interrupt status register */
    6036                 :          0 :                         tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
    6037                 :            :                                          MII_TG3_DSP_EXP1_INT_STAT);
    6038                 :          0 :                         tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &phy2);
    6039                 :          0 :                         tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &phy2);
    6040                 :            : 
    6041   [ #  #  #  # ]:          0 :                         if ((phy1 & 0x10) && !(phy2 & 0x20)) {
    6042                 :            :                                 /* We have signal detect and not receiving
    6043                 :            :                                  * config code words, link is up by parallel
    6044                 :            :                                  * detection.
    6045                 :            :                                  */
    6046                 :            : 
    6047                 :          0 :                                 bmcr &= ~BMCR_ANENABLE;
    6048                 :          0 :                                 bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX;
    6049                 :          0 :                                 tg3_writephy(tp, MII_BMCR, bmcr);
    6050                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_PARALLEL_DETECT;
    6051                 :            :                         }
    6052                 :            :                 }
    6053         [ #  # ]:          0 :         } else if (tp->link_up &&
    6054         [ #  # ]:          0 :                    (tp->link_config.autoneg == AUTONEG_ENABLE) &&
    6055         [ #  # ]:          0 :                    (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT)) {
    6056                 :          0 :                 u32 phy2;
    6057                 :            : 
    6058                 :            :                 /* Select expansion interrupt status register */
    6059                 :          0 :                 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
    6060                 :            :                                  MII_TG3_DSP_EXP1_INT_STAT);
    6061                 :          0 :                 tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &phy2);
    6062         [ #  # ]:          0 :                 if (phy2 & 0x20) {
    6063                 :          0 :                         u32 bmcr;
    6064                 :            : 
    6065                 :            :                         /* Config code words received, turn on autoneg. */
    6066                 :          0 :                         tg3_readphy(tp, MII_BMCR, &bmcr);
    6067                 :          0 :                         tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANENABLE);
    6068                 :            : 
    6069                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
    6070                 :            : 
    6071                 :            :                 }
    6072                 :            :         }
    6073                 :            : }
    6074                 :            : 
    6075                 :          0 : static int tg3_setup_phy(struct tg3 *tp, bool force_reset)
    6076                 :            : {
    6077                 :          0 :         u32 val;
    6078                 :          0 :         int err;
    6079                 :            : 
    6080         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
    6081                 :          0 :                 err = tg3_setup_fiber_phy(tp, force_reset);
    6082         [ #  # ]:          0 :         else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
    6083                 :          0 :                 err = tg3_setup_fiber_mii_phy(tp, force_reset);
    6084                 :            :         else
    6085                 :          0 :                 err = tg3_setup_copper_phy(tp, force_reset);
    6086                 :            : 
    6087         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5784_AX) {
    6088                 :          0 :                 u32 scale;
    6089                 :            : 
    6090                 :          0 :                 val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK;
    6091         [ #  # ]:          0 :                 if (val == CPMU_CLCK_STAT_MAC_CLCK_62_5)
    6092                 :            :                         scale = 65;
    6093         [ #  # ]:          0 :                 else if (val == CPMU_CLCK_STAT_MAC_CLCK_6_25)
    6094                 :            :                         scale = 6;
    6095                 :            :                 else
    6096                 :          0 :                         scale = 12;
    6097                 :            : 
    6098                 :          0 :                 val = tr32(GRC_MISC_CFG) & ~GRC_MISC_CFG_PRESCALAR_MASK;
    6099                 :          0 :                 val |= (scale << GRC_MISC_CFG_PRESCALAR_SHIFT);
    6100                 :          0 :                 tw32(GRC_MISC_CFG, val);
    6101                 :            :         }
    6102                 :            : 
    6103                 :          0 :         val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
    6104                 :            :               (6 << TX_LENGTHS_IPG_SHIFT);
    6105         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5720 ||
    6106                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762)
    6107                 :          0 :                 val |= tr32(MAC_TX_LENGTHS) &
    6108                 :            :                        (TX_LENGTHS_JMB_FRM_LEN_MSK |
    6109                 :            :                         TX_LENGTHS_CNT_DWN_VAL_MSK);
    6110                 :            : 
    6111         [ #  # ]:          0 :         if (tp->link_config.active_speed == SPEED_1000 &&
    6112         [ #  # ]:          0 :             tp->link_config.active_duplex == DUPLEX_HALF)
    6113                 :          0 :                 tw32(MAC_TX_LENGTHS, val |
    6114                 :            :                      (0xff << TX_LENGTHS_SLOT_TIME_SHIFT));
    6115                 :            :         else
    6116                 :          0 :                 tw32(MAC_TX_LENGTHS, val |
    6117                 :            :                      (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
    6118                 :            : 
    6119         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
    6120         [ #  # ]:          0 :                 if (tp->link_up) {
    6121                 :          0 :                         tw32(HOSTCC_STAT_COAL_TICKS,
    6122                 :            :                              tp->coal.stats_block_coalesce_usecs);
    6123                 :            :                 } else {
    6124                 :          0 :                         tw32(HOSTCC_STAT_COAL_TICKS, 0);
    6125                 :            :                 }
    6126                 :            :         }
    6127                 :            : 
    6128         [ #  # ]:          0 :         if (tg3_flag(tp, ASPM_WORKAROUND)) {
    6129                 :          0 :                 val = tr32(PCIE_PWR_MGMT_THRESH);
    6130         [ #  # ]:          0 :                 if (!tp->link_up)
    6131                 :          0 :                         val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK) |
    6132                 :          0 :                               tp->pwrmgmt_thresh;
    6133                 :            :                 else
    6134                 :          0 :                         val |= PCIE_PWR_MGMT_L1_THRESH_MSK;
    6135                 :          0 :                 tw32(PCIE_PWR_MGMT_THRESH, val);
    6136                 :            :         }
    6137                 :            : 
    6138                 :          0 :         return err;
    6139                 :            : }
    6140                 :            : 
    6141                 :            : /* tp->lock must be held */
    6142                 :          0 : static u64 tg3_refclk_read(struct tg3 *tp, struct ptp_system_timestamp *sts)
    6143                 :            : {
    6144                 :          0 :         u64 stamp;
    6145                 :            : 
    6146         [ #  # ]:          0 :         ptp_read_system_prets(sts);
    6147                 :          0 :         stamp = tr32(TG3_EAV_REF_CLCK_LSB);
    6148         [ #  # ]:          0 :         ptp_read_system_postts(sts);
    6149                 :          0 :         stamp |= (u64)tr32(TG3_EAV_REF_CLCK_MSB) << 32;
    6150                 :            : 
    6151                 :          0 :         return stamp;
    6152                 :            : }
    6153                 :            : 
    6154                 :            : /* tp->lock must be held */
    6155                 :          0 : static void tg3_refclk_write(struct tg3 *tp, u64 newval)
    6156                 :            : {
    6157                 :          0 :         u32 clock_ctl = tr32(TG3_EAV_REF_CLCK_CTL);
    6158                 :            : 
    6159                 :          0 :         tw32(TG3_EAV_REF_CLCK_CTL, clock_ctl | TG3_EAV_REF_CLCK_CTL_STOP);
    6160                 :          0 :         tw32(TG3_EAV_REF_CLCK_LSB, newval & 0xffffffff);
    6161                 :          0 :         tw32(TG3_EAV_REF_CLCK_MSB, newval >> 32);
    6162                 :          0 :         tw32_f(TG3_EAV_REF_CLCK_CTL, clock_ctl | TG3_EAV_REF_CLCK_CTL_RESUME);
    6163                 :          0 : }
    6164                 :            : 
    6165                 :            : static inline void tg3_full_lock(struct tg3 *tp, int irq_sync);
    6166                 :            : static inline void tg3_full_unlock(struct tg3 *tp);
    6167                 :          0 : static int tg3_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
    6168                 :            : {
    6169                 :          0 :         struct tg3 *tp = netdev_priv(dev);
    6170                 :            : 
    6171                 :          0 :         info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
    6172                 :            :                                 SOF_TIMESTAMPING_RX_SOFTWARE |
    6173                 :            :                                 SOF_TIMESTAMPING_SOFTWARE;
    6174                 :            : 
    6175         [ #  # ]:          0 :         if (tg3_flag(tp, PTP_CAPABLE)) {
    6176                 :          0 :                 info->so_timestamping |= SOF_TIMESTAMPING_TX_HARDWARE |
    6177                 :            :                                         SOF_TIMESTAMPING_RX_HARDWARE |
    6178                 :            :                                         SOF_TIMESTAMPING_RAW_HARDWARE;
    6179                 :            :         }
    6180                 :            : 
    6181         [ #  # ]:          0 :         if (tp->ptp_clock)
    6182                 :          0 :                 info->phc_index = ptp_clock_index(tp->ptp_clock);
    6183                 :            :         else
    6184                 :          0 :                 info->phc_index = -1;
    6185                 :            : 
    6186                 :          0 :         info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON);
    6187                 :            : 
    6188                 :          0 :         info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
    6189                 :            :                            (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
    6190                 :            :                            (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
    6191                 :            :                            (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
    6192                 :          0 :         return 0;
    6193                 :            : }
    6194                 :            : 
    6195                 :          0 : static int tg3_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
    6196                 :            : {
    6197                 :          0 :         struct tg3 *tp = container_of(ptp, struct tg3, ptp_info);
    6198                 :          0 :         bool neg_adj = false;
    6199                 :          0 :         u32 correction = 0;
    6200                 :            : 
    6201         [ #  # ]:          0 :         if (ppb < 0) {
    6202                 :          0 :                 neg_adj = true;
    6203                 :          0 :                 ppb = -ppb;
    6204                 :            :         }
    6205                 :            : 
    6206                 :            :         /* Frequency adjustment is performed using hardware with a 24 bit
    6207                 :            :          * accumulator and a programmable correction value. On each clk, the
    6208                 :            :          * correction value gets added to the accumulator and when it
    6209                 :            :          * overflows, the time counter is incremented/decremented.
    6210                 :            :          *
    6211                 :            :          * So conversion from ppb to correction value is
    6212                 :            :          *              ppb * (1 << 24) / 1000000000
    6213                 :            :          */
    6214                 :          0 :         correction = div_u64((u64)ppb * (1 << 24), 1000000000ULL) &
    6215                 :            :                      TG3_EAV_REF_CLK_CORRECT_MASK;
    6216                 :            : 
    6217                 :          0 :         tg3_full_lock(tp, 0);
    6218                 :            : 
    6219                 :          0 :         if (correction)
    6220         [ #  # ]:          0 :                 tw32(TG3_EAV_REF_CLK_CORRECT_CTL,
    6221                 :            :                      TG3_EAV_REF_CLK_CORRECT_EN |
    6222                 :            :                      (neg_adj ? TG3_EAV_REF_CLK_CORRECT_NEG : 0) | correction);
    6223                 :            :         else
    6224                 :          0 :                 tw32(TG3_EAV_REF_CLK_CORRECT_CTL, 0);
    6225                 :            : 
    6226                 :          0 :         tg3_full_unlock(tp);
    6227                 :            : 
    6228                 :          0 :         return 0;
    6229                 :            : }
    6230                 :            : 
    6231                 :          0 : static int tg3_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
    6232                 :            : {
    6233                 :          0 :         struct tg3 *tp = container_of(ptp, struct tg3, ptp_info);
    6234                 :            : 
    6235                 :          0 :         tg3_full_lock(tp, 0);
    6236                 :          0 :         tp->ptp_adjust += delta;
    6237                 :          0 :         tg3_full_unlock(tp);
    6238                 :            : 
    6239                 :          0 :         return 0;
    6240                 :            : }
    6241                 :            : 
    6242                 :          0 : static int tg3_ptp_gettimex(struct ptp_clock_info *ptp, struct timespec64 *ts,
    6243                 :            :                             struct ptp_system_timestamp *sts)
    6244                 :            : {
    6245                 :          0 :         u64 ns;
    6246                 :          0 :         struct tg3 *tp = container_of(ptp, struct tg3, ptp_info);
    6247                 :            : 
    6248                 :          0 :         tg3_full_lock(tp, 0);
    6249                 :          0 :         ns = tg3_refclk_read(tp, sts);
    6250                 :          0 :         ns += tp->ptp_adjust;
    6251                 :          0 :         tg3_full_unlock(tp);
    6252                 :            : 
    6253                 :          0 :         *ts = ns_to_timespec64(ns);
    6254                 :            : 
    6255                 :          0 :         return 0;
    6256                 :            : }
    6257                 :            : 
    6258                 :          0 : static int tg3_ptp_settime(struct ptp_clock_info *ptp,
    6259                 :            :                            const struct timespec64 *ts)
    6260                 :            : {
    6261                 :          0 :         u64 ns;
    6262                 :          0 :         struct tg3 *tp = container_of(ptp, struct tg3, ptp_info);
    6263                 :            : 
    6264                 :          0 :         ns = timespec64_to_ns(ts);
    6265                 :            : 
    6266                 :          0 :         tg3_full_lock(tp, 0);
    6267                 :          0 :         tg3_refclk_write(tp, ns);
    6268                 :          0 :         tp->ptp_adjust = 0;
    6269                 :          0 :         tg3_full_unlock(tp);
    6270                 :            : 
    6271                 :          0 :         return 0;
    6272                 :            : }
    6273                 :            : 
    6274                 :          0 : static int tg3_ptp_enable(struct ptp_clock_info *ptp,
    6275                 :            :                           struct ptp_clock_request *rq, int on)
    6276                 :            : {
    6277                 :          0 :         struct tg3 *tp = container_of(ptp, struct tg3, ptp_info);
    6278                 :          0 :         u32 clock_ctl;
    6279                 :          0 :         int rval = 0;
    6280                 :            : 
    6281         [ #  # ]:          0 :         switch (rq->type) {
    6282                 :          0 :         case PTP_CLK_REQ_PEROUT:
    6283                 :            :                 /* Reject requests with unsupported flags */
    6284         [ #  # ]:          0 :                 if (rq->perout.flags)
    6285                 :            :                         return -EOPNOTSUPP;
    6286                 :            : 
    6287         [ #  # ]:          0 :                 if (rq->perout.index != 0)
    6288                 :            :                         return -EINVAL;
    6289                 :            : 
    6290                 :          0 :                 tg3_full_lock(tp, 0);
    6291                 :          0 :                 clock_ctl = tr32(TG3_EAV_REF_CLCK_CTL);
    6292                 :          0 :                 clock_ctl &= ~TG3_EAV_CTL_TSYNC_GPIO_MASK;
    6293                 :            : 
    6294         [ #  # ]:          0 :                 if (on) {
    6295                 :          0 :                         u64 nsec;
    6296                 :            : 
    6297                 :          0 :                         nsec = rq->perout.start.sec * 1000000000ULL +
    6298                 :          0 :                                rq->perout.start.nsec;
    6299                 :            : 
    6300   [ #  #  #  # ]:          0 :                         if (rq->perout.period.sec || rq->perout.period.nsec) {
    6301                 :          0 :                                 netdev_warn(tp->dev,
    6302                 :            :                                             "Device supports only a one-shot timesync output, period must be 0\n");
    6303                 :          0 :                                 rval = -EINVAL;
    6304                 :          0 :                                 goto err_out;
    6305                 :            :                         }
    6306                 :            : 
    6307         [ #  # ]:          0 :                         if (nsec & (1ULL << 63)) {
    6308                 :          0 :                                 netdev_warn(tp->dev,
    6309                 :            :                                             "Start value (nsec) is over limit. Maximum size of start is only 63 bits\n");
    6310                 :          0 :                                 rval = -EINVAL;
    6311                 :          0 :                                 goto err_out;
    6312                 :            :                         }
    6313                 :            : 
    6314                 :          0 :                         tw32(TG3_EAV_WATCHDOG0_LSB, (nsec & 0xffffffff));
    6315                 :          0 :                         tw32(TG3_EAV_WATCHDOG0_MSB,
    6316                 :            :                              TG3_EAV_WATCHDOG0_EN |
    6317                 :            :                              ((nsec >> 32) & TG3_EAV_WATCHDOG_MSB_MASK));
    6318                 :            : 
    6319                 :          0 :                         tw32(TG3_EAV_REF_CLCK_CTL,
    6320                 :            :                              clock_ctl | TG3_EAV_CTL_TSYNC_WDOG0);
    6321                 :            :                 } else {
    6322                 :          0 :                         tw32(TG3_EAV_WATCHDOG0_MSB, 0);
    6323                 :          0 :                         tw32(TG3_EAV_REF_CLCK_CTL, clock_ctl);
    6324                 :            :                 }
    6325                 :            : 
    6326                 :          0 : err_out:
    6327                 :          0 :                 tg3_full_unlock(tp);
    6328                 :          0 :                 return rval;
    6329                 :            : 
    6330                 :            :         default:
    6331                 :            :                 break;
    6332                 :            :         }
    6333                 :            : 
    6334                 :            :         return -EOPNOTSUPP;
    6335                 :            : }
    6336                 :            : 
    6337                 :            : static const struct ptp_clock_info tg3_ptp_caps = {
    6338                 :            :         .owner          = THIS_MODULE,
    6339                 :            :         .name           = "tg3 clock",
    6340                 :            :         .max_adj        = 250000000,
    6341                 :            :         .n_alarm        = 0,
    6342                 :            :         .n_ext_ts       = 0,
    6343                 :            :         .n_per_out      = 1,
    6344                 :            :         .n_pins         = 0,
    6345                 :            :         .pps            = 0,
    6346                 :            :         .adjfreq        = tg3_ptp_adjfreq,
    6347                 :            :         .adjtime        = tg3_ptp_adjtime,
    6348                 :            :         .gettimex64     = tg3_ptp_gettimex,
    6349                 :            :         .settime64      = tg3_ptp_settime,
    6350                 :            :         .enable         = tg3_ptp_enable,
    6351                 :            : };
    6352                 :            : 
    6353                 :          0 : static void tg3_hwclock_to_timestamp(struct tg3 *tp, u64 hwclock,
    6354                 :            :                                      struct skb_shared_hwtstamps *timestamp)
    6355                 :            : {
    6356                 :          0 :         memset(timestamp, 0, sizeof(struct skb_shared_hwtstamps));
    6357                 :          0 :         timestamp->hwtstamp  = ns_to_ktime((hwclock & TG3_TSTAMP_MASK) +
    6358                 :          0 :                                            tp->ptp_adjust);
    6359                 :          0 : }
    6360                 :            : 
    6361                 :            : /* tp->lock must be held */
    6362                 :          0 : static void tg3_ptp_init(struct tg3 *tp)
    6363                 :            : {
    6364         [ #  # ]:          0 :         if (!tg3_flag(tp, PTP_CAPABLE))
    6365                 :            :                 return;
    6366                 :            : 
    6367                 :            :         /* Initialize the hardware clock to the system time. */
    6368                 :          0 :         tg3_refclk_write(tp, ktime_to_ns(ktime_get_real()));
    6369                 :          0 :         tp->ptp_adjust = 0;
    6370                 :          0 :         tp->ptp_info = tg3_ptp_caps;
    6371                 :            : }
    6372                 :            : 
    6373                 :            : /* tp->lock must be held */
    6374                 :          0 : static void tg3_ptp_resume(struct tg3 *tp)
    6375                 :            : {
    6376         [ #  # ]:          0 :         if (!tg3_flag(tp, PTP_CAPABLE))
    6377                 :            :                 return;
    6378                 :            : 
    6379                 :          0 :         tg3_refclk_write(tp, ktime_to_ns(ktime_get_real()) + tp->ptp_adjust);
    6380                 :          0 :         tp->ptp_adjust = 0;
    6381                 :            : }
    6382                 :            : 
    6383                 :          0 : static void tg3_ptp_fini(struct tg3 *tp)
    6384                 :            : {
    6385   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, PTP_CAPABLE) || !tp->ptp_clock)
    6386                 :            :                 return;
    6387                 :            : 
    6388                 :          0 :         ptp_clock_unregister(tp->ptp_clock);
    6389                 :          0 :         tp->ptp_clock = NULL;
    6390                 :          0 :         tp->ptp_adjust = 0;
    6391                 :            : }
    6392                 :            : 
    6393                 :          0 : static inline int tg3_irq_sync(struct tg3 *tp)
    6394                 :            : {
    6395                 :          0 :         return tp->irq_sync;
    6396                 :            : }
    6397                 :            : 
    6398                 :          0 : static inline void tg3_rd32_loop(struct tg3 *tp, u32 *dst, u32 off, u32 len)
    6399                 :            : {
    6400                 :          0 :         int i;
    6401                 :            : 
    6402                 :          0 :         dst = (u32 *)((u8 *)dst + off);
    6403   [ #  #  #  #  :          0 :         for (i = 0; i < len; i += sizeof(u32))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    6404                 :          0 :                 *dst++ = tr32(off + i);
    6405                 :            : }
    6406                 :            : 
    6407                 :          0 : static void tg3_dump_legacy_regs(struct tg3 *tp, u32 *regs)
    6408                 :            : {
    6409                 :          0 :         tg3_rd32_loop(tp, regs, TG3PCI_VENDOR, 0xb0);
    6410                 :          0 :         tg3_rd32_loop(tp, regs, MAILBOX_INTERRUPT_0, 0x200);
    6411                 :          0 :         tg3_rd32_loop(tp, regs, MAC_MODE, 0x4f0);
    6412                 :          0 :         tg3_rd32_loop(tp, regs, SNDDATAI_MODE, 0xe0);
    6413                 :          0 :         tg3_rd32_loop(tp, regs, SNDDATAC_MODE, 0x04);
    6414                 :          0 :         tg3_rd32_loop(tp, regs, SNDBDS_MODE, 0x80);
    6415                 :          0 :         tg3_rd32_loop(tp, regs, SNDBDI_MODE, 0x48);
    6416                 :          0 :         tg3_rd32_loop(tp, regs, SNDBDC_MODE, 0x04);
    6417                 :          0 :         tg3_rd32_loop(tp, regs, RCVLPC_MODE, 0x20);
    6418                 :          0 :         tg3_rd32_loop(tp, regs, RCVLPC_SELLST_BASE, 0x15c);
    6419                 :          0 :         tg3_rd32_loop(tp, regs, RCVDBDI_MODE, 0x0c);
    6420                 :          0 :         tg3_rd32_loop(tp, regs, RCVDBDI_JUMBO_BD, 0x3c);
    6421                 :          0 :         tg3_rd32_loop(tp, regs, RCVDBDI_BD_PROD_IDX_0, 0x44);
    6422                 :          0 :         tg3_rd32_loop(tp, regs, RCVDCC_MODE, 0x04);
    6423                 :          0 :         tg3_rd32_loop(tp, regs, RCVBDI_MODE, 0x20);
    6424                 :          0 :         tg3_rd32_loop(tp, regs, RCVCC_MODE, 0x14);
    6425                 :          0 :         tg3_rd32_loop(tp, regs, RCVLSC_MODE, 0x08);
    6426                 :          0 :         tg3_rd32_loop(tp, regs, MBFREE_MODE, 0x08);
    6427                 :          0 :         tg3_rd32_loop(tp, regs, HOSTCC_MODE, 0x100);
    6428                 :            : 
    6429         [ #  # ]:          0 :         if (tg3_flag(tp, SUPPORT_MSIX))
    6430                 :          0 :                 tg3_rd32_loop(tp, regs, HOSTCC_RXCOL_TICKS_VEC1, 0x180);
    6431                 :            : 
    6432                 :          0 :         tg3_rd32_loop(tp, regs, MEMARB_MODE, 0x10);
    6433                 :          0 :         tg3_rd32_loop(tp, regs, BUFMGR_MODE, 0x58);
    6434                 :          0 :         tg3_rd32_loop(tp, regs, RDMAC_MODE, 0x08);
    6435                 :          0 :         tg3_rd32_loop(tp, regs, WDMAC_MODE, 0x08);
    6436                 :          0 :         tg3_rd32_loop(tp, regs, RX_CPU_MODE, 0x04);
    6437                 :          0 :         tg3_rd32_loop(tp, regs, RX_CPU_STATE, 0x04);
    6438                 :          0 :         tg3_rd32_loop(tp, regs, RX_CPU_PGMCTR, 0x04);
    6439                 :          0 :         tg3_rd32_loop(tp, regs, RX_CPU_HWBKPT, 0x04);
    6440                 :            : 
    6441         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
    6442                 :          0 :                 tg3_rd32_loop(tp, regs, TX_CPU_MODE, 0x04);
    6443                 :          0 :                 tg3_rd32_loop(tp, regs, TX_CPU_STATE, 0x04);
    6444                 :          0 :                 tg3_rd32_loop(tp, regs, TX_CPU_PGMCTR, 0x04);
    6445                 :            :         }
    6446                 :            : 
    6447                 :          0 :         tg3_rd32_loop(tp, regs, GRCMBOX_INTERRUPT_0, 0x110);
    6448                 :          0 :         tg3_rd32_loop(tp, regs, FTQ_RESET, 0x120);
    6449                 :          0 :         tg3_rd32_loop(tp, regs, MSGINT_MODE, 0x0c);
    6450                 :          0 :         tg3_rd32_loop(tp, regs, DMAC_MODE, 0x04);
    6451                 :          0 :         tg3_rd32_loop(tp, regs, GRC_MODE, 0x4c);
    6452                 :            : 
    6453         [ #  # ]:          0 :         if (tg3_flag(tp, NVRAM))
    6454                 :          0 :                 tg3_rd32_loop(tp, regs, NVRAM_CMD, 0x24);
    6455                 :          0 : }
    6456                 :            : 
    6457                 :          0 : static void tg3_dump_state(struct tg3 *tp)
    6458                 :            : {
    6459                 :          0 :         int i;
    6460                 :          0 :         u32 *regs;
    6461                 :            : 
    6462                 :          0 :         regs = kzalloc(TG3_REG_BLK_SIZE, GFP_ATOMIC);
    6463         [ #  # ]:          0 :         if (!regs)
    6464                 :            :                 return;
    6465                 :            : 
    6466         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS)) {
    6467                 :            :                 /* Read up to but not including private PCI registers */
    6468         [ #  # ]:          0 :                 for (i = 0; i < TG3_PCIE_TLDLPL_PORT; i += sizeof(u32))
    6469                 :          0 :                         regs[i / sizeof(u32)] = tr32(i);
    6470                 :            :         } else
    6471                 :          0 :                 tg3_dump_legacy_regs(tp, regs);
    6472                 :            : 
    6473         [ #  # ]:          0 :         for (i = 0; i < TG3_REG_BLK_SIZE / sizeof(u32); i += 4) {
    6474   [ #  #  #  # ]:          0 :                 if (!regs[i + 0] && !regs[i + 1] &&
    6475   [ #  #  #  # ]:          0 :                     !regs[i + 2] && !regs[i + 3])
    6476                 :          0 :                         continue;
    6477                 :            : 
    6478                 :          0 :                 netdev_err(tp->dev, "0x%08x: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
    6479                 :            :                            i * 4,
    6480                 :          0 :                            regs[i + 0], regs[i + 1], regs[i + 2], regs[i + 3]);
    6481                 :            :         }
    6482                 :            : 
    6483                 :          0 :         kfree(regs);
    6484                 :            : 
    6485         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    6486                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    6487                 :            : 
    6488                 :            :                 /* SW status block */
    6489                 :          0 :                 netdev_err(tp->dev,
    6490                 :            :                          "%d: Host status block [%08x:%08x:(%04x:%04x:%04x):(%04x:%04x)]\n",
    6491                 :            :                            i,
    6492                 :            :                            tnapi->hw_status->status,
    6493                 :            :                            tnapi->hw_status->status_tag,
    6494                 :          0 :                            tnapi->hw_status->rx_jumbo_consumer,
    6495                 :          0 :                            tnapi->hw_status->rx_consumer,
    6496                 :          0 :                            tnapi->hw_status->rx_mini_consumer,
    6497                 :          0 :                            tnapi->hw_status->idx[0].rx_producer,
    6498                 :          0 :                            tnapi->hw_status->idx[0].tx_consumer);
    6499                 :            : 
    6500                 :          0 :                 netdev_err(tp->dev,
    6501                 :            :                 "%d: NAPI info [%08x:%08x:(%04x:%04x:%04x):%04x:(%04x:%04x:%04x:%04x)]\n",
    6502                 :            :                            i,
    6503                 :            :                            tnapi->last_tag, tnapi->last_irq_tag,
    6504                 :            :                            tnapi->tx_prod, tnapi->tx_cons, tnapi->tx_pending,
    6505                 :            :                            tnapi->rx_rcb_ptr,
    6506                 :            :                            tnapi->prodring.rx_std_prod_idx,
    6507                 :            :                            tnapi->prodring.rx_std_cons_idx,
    6508                 :            :                            tnapi->prodring.rx_jmb_prod_idx,
    6509                 :            :                            tnapi->prodring.rx_jmb_cons_idx);
    6510                 :            :         }
    6511                 :            : }
    6512                 :            : 
    6513                 :            : /* This is called whenever we suspect that the system chipset is re-
    6514                 :            :  * ordering the sequence of MMIO to the tx send mailbox. The symptom
    6515                 :            :  * is bogus tx completions. We try to recover by setting the
    6516                 :            :  * TG3_FLAG_MBOX_WRITE_REORDER flag and resetting the chip later
    6517                 :            :  * in the workqueue.
    6518                 :            :  */
    6519                 :          0 : static void tg3_tx_recover(struct tg3 *tp)
    6520                 :            : {
    6521   [ #  #  #  # ]:          0 :         BUG_ON(tg3_flag(tp, MBOX_WRITE_REORDER) ||
    6522                 :            :                tp->write32_tx_mbox == tg3_write_indirect_mbox);
    6523                 :            : 
    6524                 :          0 :         netdev_warn(tp->dev,
    6525                 :            :                     "The system may be re-ordering memory-mapped I/O "
    6526                 :            :                     "cycles to the network device, attempting to recover. "
    6527                 :            :                     "Please report the problem to the driver maintainer "
    6528                 :            :                     "and include system chipset information.\n");
    6529                 :            : 
    6530                 :          0 :         tg3_flag_set(tp, TX_RECOVERY_PENDING);
    6531                 :          0 : }
    6532                 :            : 
    6533                 :          0 : static inline u32 tg3_tx_avail(struct tg3_napi *tnapi)
    6534                 :            : {
    6535                 :            :         /* Tell compiler to fetch tx indices from memory. */
    6536                 :          0 :         barrier();
    6537                 :          0 :         return tnapi->tx_pending -
    6538                 :          0 :                ((tnapi->tx_prod - tnapi->tx_cons) & (TG3_TX_RING_SIZE - 1));
    6539                 :            : }
    6540                 :            : 
    6541                 :            : /* Tigon3 never reports partial packet sends.  So we do not
    6542                 :            :  * need special logic to handle SKBs that have not had all
    6543                 :            :  * of their frags sent yet, like SunGEM does.
    6544                 :            :  */
    6545                 :          0 : static void tg3_tx(struct tg3_napi *tnapi)
    6546                 :            : {
    6547                 :          0 :         struct tg3 *tp = tnapi->tp;
    6548                 :          0 :         u32 hw_idx = tnapi->hw_status->idx[0].tx_consumer;
    6549                 :          0 :         u32 sw_idx = tnapi->tx_cons;
    6550                 :          0 :         struct netdev_queue *txq;
    6551                 :          0 :         int index = tnapi - tp->napi;
    6552                 :          0 :         unsigned int pkts_compl = 0, bytes_compl = 0;
    6553                 :            : 
    6554         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_TSS))
    6555                 :          0 :                 index--;
    6556                 :            : 
    6557                 :          0 :         txq = netdev_get_tx_queue(tp->dev, index);
    6558                 :            : 
    6559         [ #  # ]:          0 :         while (sw_idx != hw_idx) {
    6560                 :          0 :                 struct tg3_tx_ring_info *ri = &tnapi->tx_buffers[sw_idx];
    6561                 :          0 :                 struct sk_buff *skb = ri->skb;
    6562                 :          0 :                 int i, tx_bug = 0;
    6563                 :            : 
    6564         [ #  # ]:          0 :                 if (unlikely(skb == NULL)) {
    6565                 :          0 :                         tg3_tx_recover(tp);
    6566                 :          0 :                         return;
    6567                 :            :                 }
    6568                 :            : 
    6569         [ #  # ]:          0 :                 if (tnapi->tx_ring[sw_idx].len_flags & TXD_FLAG_HWTSTAMP) {
    6570                 :          0 :                         struct skb_shared_hwtstamps timestamp;
    6571                 :          0 :                         u64 hwclock = tr32(TG3_TX_TSTAMP_LSB);
    6572                 :          0 :                         hwclock |= (u64)tr32(TG3_TX_TSTAMP_MSB) << 32;
    6573                 :            : 
    6574                 :          0 :                         tg3_hwclock_to_timestamp(tp, hwclock, &timestamp);
    6575                 :            : 
    6576                 :          0 :                         skb_tstamp_tx(skb, &timestamp);
    6577                 :            :                 }
    6578                 :            : 
    6579                 :          0 :                 pci_unmap_single(tp->pdev,
    6580                 :            :                                  dma_unmap_addr(ri, mapping),
    6581                 :          0 :                                  skb_headlen(skb),
    6582                 :            :                                  PCI_DMA_TODEVICE);
    6583                 :            : 
    6584                 :          0 :                 ri->skb = NULL;
    6585                 :            : 
    6586         [ #  # ]:          0 :                 while (ri->fragmented) {
    6587                 :          0 :                         ri->fragmented = false;
    6588                 :          0 :                         sw_idx = NEXT_TX(sw_idx);
    6589                 :          0 :                         ri = &tnapi->tx_buffers[sw_idx];
    6590                 :            :                 }
    6591                 :            : 
    6592                 :          0 :                 sw_idx = NEXT_TX(sw_idx);
    6593                 :            : 
    6594         [ #  # ]:          0 :                 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
    6595                 :          0 :                         ri = &tnapi->tx_buffers[sw_idx];
    6596   [ #  #  #  # ]:          0 :                         if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
    6597                 :          0 :                                 tx_bug = 1;
    6598                 :            : 
    6599                 :          0 :                         pci_unmap_page(tp->pdev,
    6600                 :            :                                        dma_unmap_addr(ri, mapping),
    6601                 :          0 :                                        skb_frag_size(&skb_shinfo(skb)->frags[i]),
    6602                 :            :                                        PCI_DMA_TODEVICE);
    6603                 :            : 
    6604         [ #  # ]:          0 :                         while (ri->fragmented) {
    6605                 :          0 :                                 ri->fragmented = false;
    6606                 :          0 :                                 sw_idx = NEXT_TX(sw_idx);
    6607                 :          0 :                                 ri = &tnapi->tx_buffers[sw_idx];
    6608                 :            :                         }
    6609                 :            : 
    6610                 :          0 :                         sw_idx = NEXT_TX(sw_idx);
    6611                 :            :                 }
    6612                 :            : 
    6613                 :          0 :                 pkts_compl++;
    6614                 :          0 :                 bytes_compl += skb->len;
    6615                 :            : 
    6616                 :          0 :                 dev_consume_skb_any(skb);
    6617                 :            : 
    6618         [ #  # ]:          0 :                 if (unlikely(tx_bug)) {
    6619                 :          0 :                         tg3_tx_recover(tp);
    6620                 :          0 :                         return;
    6621                 :            :                 }
    6622                 :            :         }
    6623                 :            : 
    6624                 :          0 :         netdev_tx_completed_queue(txq, pkts_compl, bytes_compl);
    6625                 :            : 
    6626                 :          0 :         tnapi->tx_cons = sw_idx;
    6627                 :            : 
    6628                 :            :         /* Need to make the tx_cons update visible to tg3_start_xmit()
    6629                 :            :          * before checking for netif_queue_stopped().  Without the
    6630                 :            :          * memory barrier, there is a small possibility that tg3_start_xmit()
    6631                 :            :          * will miss it and cause the queue to be stopped forever.
    6632                 :            :          */
    6633                 :          0 :         smp_mb();
    6634                 :            : 
    6635   [ #  #  #  # ]:          0 :         if (unlikely(netif_tx_queue_stopped(txq) &&
    6636                 :            :                      (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)))) {
    6637                 :          0 :                 __netif_tx_lock(txq, smp_processor_id());
    6638         [ #  # ]:          0 :                 if (netif_tx_queue_stopped(txq) &&
    6639         [ #  # ]:          0 :                     (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi)))
    6640                 :          0 :                         netif_tx_wake_queue(txq);
    6641                 :          0 :                 __netif_tx_unlock(txq);
    6642                 :            :         }
    6643                 :            : }
    6644                 :            : 
    6645                 :          0 : static void tg3_frag_free(bool is_frag, void *data)
    6646                 :            : {
    6647                 :          0 :         if (is_frag)
    6648                 :          0 :                 skb_free_frag(data);
    6649                 :            :         else
    6650                 :          0 :                 kfree(data);
    6651                 :            : }
    6652                 :            : 
    6653                 :            : static void tg3_rx_data_free(struct tg3 *tp, struct ring_info *ri, u32 map_sz)
    6654                 :            : {
    6655                 :            :         unsigned int skb_size = SKB_DATA_ALIGN(map_sz + TG3_RX_OFFSET(tp)) +
    6656                 :            :                    SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
    6657                 :            : 
    6658                 :            :         if (!ri->data)
    6659                 :            :                 return;
    6660                 :            : 
    6661                 :            :         pci_unmap_single(tp->pdev, dma_unmap_addr(ri, mapping),
    6662                 :            :                          map_sz, PCI_DMA_FROMDEVICE);
    6663                 :            :         tg3_frag_free(skb_size <= PAGE_SIZE, ri->data);
    6664                 :            :         ri->data = NULL;
    6665                 :            : }
    6666                 :            : 
    6667                 :            : 
    6668                 :            : /* Returns size of skb allocated or < 0 on error.
    6669                 :            :  *
    6670                 :            :  * We only need to fill in the address because the other members
    6671                 :            :  * of the RX descriptor are invariant, see tg3_init_rings.
    6672                 :            :  *
    6673                 :            :  * Note the purposeful assymetry of cpu vs. chip accesses.  For
    6674                 :            :  * posting buffers we only dirty the first cache line of the RX
    6675                 :            :  * descriptor (containing the address).  Whereas for the RX status
    6676                 :            :  * buffers the cpu only reads the last cacheline of the RX descriptor
    6677                 :            :  * (to fetch the error flags, vlan tag, checksum, and opaque cookie).
    6678                 :            :  */
    6679                 :          0 : static int tg3_alloc_rx_data(struct tg3 *tp, struct tg3_rx_prodring_set *tpr,
    6680                 :            :                              u32 opaque_key, u32 dest_idx_unmasked,
    6681                 :            :                              unsigned int *frag_size)
    6682                 :            : {
    6683                 :          0 :         struct tg3_rx_buffer_desc *desc;
    6684                 :          0 :         struct ring_info *map;
    6685                 :          0 :         u8 *data;
    6686                 :          0 :         dma_addr_t mapping;
    6687                 :          0 :         int skb_size, data_size, dest_idx;
    6688                 :            : 
    6689      [ #  #  # ]:          0 :         switch (opaque_key) {
    6690                 :          0 :         case RXD_OPAQUE_RING_STD:
    6691                 :          0 :                 dest_idx = dest_idx_unmasked & tp->rx_std_ring_mask;
    6692                 :          0 :                 desc = &tpr->rx_std[dest_idx];
    6693                 :          0 :                 map = &tpr->rx_std_buffers[dest_idx];
    6694                 :          0 :                 data_size = tp->rx_pkt_map_sz;
    6695                 :          0 :                 break;
    6696                 :            : 
    6697                 :          0 :         case RXD_OPAQUE_RING_JUMBO:
    6698                 :          0 :                 dest_idx = dest_idx_unmasked & tp->rx_jmb_ring_mask;
    6699                 :          0 :                 desc = &tpr->rx_jmb[dest_idx].std;
    6700                 :          0 :                 map = &tpr->rx_jmb_buffers[dest_idx];
    6701                 :          0 :                 data_size = TG3_RX_JMB_MAP_SZ;
    6702                 :          0 :                 break;
    6703                 :            : 
    6704                 :            :         default:
    6705                 :            :                 return -EINVAL;
    6706                 :            :         }
    6707                 :            : 
    6708                 :            :         /* Do not overwrite any of the map or rp information
    6709                 :            :          * until we are sure we can commit to a new buffer.
    6710                 :            :          *
    6711                 :            :          * Callers depend upon this behavior and assume that
    6712                 :            :          * we leave everything unchanged if we fail.
    6713                 :            :          */
    6714                 :          0 :         skb_size = SKB_DATA_ALIGN(data_size + TG3_RX_OFFSET(tp)) +
    6715                 :            :                    SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
    6716         [ #  # ]:          0 :         if (skb_size <= PAGE_SIZE) {
    6717                 :          0 :                 data = napi_alloc_frag(skb_size);
    6718                 :          0 :                 *frag_size = skb_size;
    6719                 :            :         } else {
    6720         [ #  # ]:          0 :                 data = kmalloc(skb_size, GFP_ATOMIC);
    6721                 :          0 :                 *frag_size = 0;
    6722                 :            :         }
    6723         [ #  # ]:          0 :         if (!data)
    6724                 :            :                 return -ENOMEM;
    6725                 :            : 
    6726                 :          0 :         mapping = pci_map_single(tp->pdev,
    6727                 :          0 :                                  data + TG3_RX_OFFSET(tp),
    6728                 :            :                                  data_size,
    6729                 :            :                                  PCI_DMA_FROMDEVICE);
    6730         [ #  # ]:          0 :         if (unlikely(pci_dma_mapping_error(tp->pdev, mapping))) {
    6731         [ #  # ]:          0 :                 tg3_frag_free(skb_size <= PAGE_SIZE, data);
    6732                 :          0 :                 return -EIO;
    6733                 :            :         }
    6734                 :            : 
    6735                 :          0 :         map->data = data;
    6736                 :          0 :         dma_unmap_addr_set(map, mapping, mapping);
    6737                 :            : 
    6738                 :          0 :         desc->addr_hi = ((u64)mapping >> 32);
    6739                 :          0 :         desc->addr_lo = ((u64)mapping & 0xffffffff);
    6740                 :            : 
    6741                 :          0 :         return data_size;
    6742                 :            : }
    6743                 :            : 
    6744                 :            : /* We only need to move over in the address because the other
    6745                 :            :  * members of the RX descriptor are invariant.  See notes above
    6746                 :            :  * tg3_alloc_rx_data for full details.
    6747                 :            :  */
    6748                 :            : static void tg3_recycle_rx(struct tg3_napi *tnapi,
    6749                 :            :                            struct tg3_rx_prodring_set *dpr,
    6750                 :            :                            u32 opaque_key, int src_idx,
    6751                 :            :                            u32 dest_idx_unmasked)
    6752                 :            : {
    6753                 :            :         struct tg3 *tp = tnapi->tp;
    6754                 :            :         struct tg3_rx_buffer_desc *src_desc, *dest_desc;
    6755                 :            :         struct ring_info *src_map, *dest_map;
    6756                 :            :         struct tg3_rx_prodring_set *spr = &tp->napi[0].prodring;
    6757                 :            :         int dest_idx;
    6758                 :            : 
    6759                 :            :         switch (opaque_key) {
    6760                 :            :         case RXD_OPAQUE_RING_STD:
    6761                 :            :                 dest_idx = dest_idx_unmasked & tp->rx_std_ring_mask;
    6762                 :            :                 dest_desc = &dpr->rx_std[dest_idx];
    6763                 :            :                 dest_map = &dpr->rx_std_buffers[dest_idx];
    6764                 :            :                 src_desc = &spr->rx_std[src_idx];
    6765                 :            :                 src_map = &spr->rx_std_buffers[src_idx];
    6766                 :            :                 break;
    6767                 :            : 
    6768                 :            :         case RXD_OPAQUE_RING_JUMBO:
    6769                 :            :                 dest_idx = dest_idx_unmasked & tp->rx_jmb_ring_mask;
    6770                 :            :                 dest_desc = &dpr->rx_jmb[dest_idx].std;
    6771                 :            :                 dest_map = &dpr->rx_jmb_buffers[dest_idx];
    6772                 :            :                 src_desc = &spr->rx_jmb[src_idx].std;
    6773                 :            :                 src_map = &spr->rx_jmb_buffers[src_idx];
    6774                 :            :                 break;
    6775                 :            : 
    6776                 :            :         default:
    6777                 :            :                 return;
    6778                 :            :         }
    6779                 :            : 
    6780                 :            :         dest_map->data = src_map->data;
    6781                 :            :         dma_unmap_addr_set(dest_map, mapping,
    6782                 :            :                            dma_unmap_addr(src_map, mapping));
    6783                 :            :         dest_desc->addr_hi = src_desc->addr_hi;
    6784                 :            :         dest_desc->addr_lo = src_desc->addr_lo;
    6785                 :            : 
    6786                 :            :         /* Ensure that the update to the skb happens after the physical
    6787                 :            :          * addresses have been transferred to the new BD location.
    6788                 :            :          */
    6789                 :            :         smp_wmb();
    6790                 :            : 
    6791                 :            :         src_map->data = NULL;
    6792                 :            : }
    6793                 :            : 
    6794                 :            : /* The RX ring scheme is composed of multiple rings which post fresh
    6795                 :            :  * buffers to the chip, and one special ring the chip uses to report
    6796                 :            :  * status back to the host.
    6797                 :            :  *
    6798                 :            :  * The special ring reports the status of received packets to the
    6799                 :            :  * host.  The chip does not write into the original descriptor the
    6800                 :            :  * RX buffer was obtained from.  The chip simply takes the original
    6801                 :            :  * descriptor as provided by the host, updates the status and length
    6802                 :            :  * field, then writes this into the next status ring entry.
    6803                 :            :  *
    6804                 :            :  * Each ring the host uses to post buffers to the chip is described
    6805                 :            :  * by a TG3_BDINFO entry in the chips SRAM area.  When a packet arrives,
    6806                 :            :  * it is first placed into the on-chip ram.  When the packet's length
    6807                 :            :  * is known, it walks down the TG3_BDINFO entries to select the ring.
    6808                 :            :  * Each TG3_BDINFO specifies a MAXLEN field and the first TG3_BDINFO
    6809                 :            :  * which is within the range of the new packet's length is chosen.
    6810                 :            :  *
    6811                 :            :  * The "separate ring for rx status" scheme may sound queer, but it makes
    6812                 :            :  * sense from a cache coherency perspective.  If only the host writes
    6813                 :            :  * to the buffer post rings, and only the chip writes to the rx status
    6814                 :            :  * rings, then cache lines never move beyond shared-modified state.
    6815                 :            :  * If both the host and chip were to write into the same ring, cache line
    6816                 :            :  * eviction could occur since both entities want it in an exclusive state.
    6817                 :            :  */
    6818                 :          0 : static int tg3_rx(struct tg3_napi *tnapi, int budget)
    6819                 :            : {
    6820                 :          0 :         struct tg3 *tp = tnapi->tp;
    6821                 :          0 :         u32 work_mask, rx_std_posted = 0;
    6822                 :          0 :         u32 std_prod_idx, jmb_prod_idx;
    6823                 :          0 :         u32 sw_idx = tnapi->rx_rcb_ptr;
    6824                 :          0 :         u16 hw_idx;
    6825                 :          0 :         int received;
    6826                 :          0 :         struct tg3_rx_prodring_set *tpr = &tnapi->prodring;
    6827                 :            : 
    6828                 :          0 :         hw_idx = *(tnapi->rx_rcb_prod_idx);
    6829                 :            :         /*
    6830                 :            :          * We need to order the read of hw_idx and the read of
    6831                 :            :          * the opaque cookie.
    6832                 :            :          */
    6833                 :          0 :         rmb();
    6834                 :          0 :         work_mask = 0;
    6835                 :          0 :         received = 0;
    6836                 :          0 :         std_prod_idx = tpr->rx_std_prod_idx;
    6837                 :          0 :         jmb_prod_idx = tpr->rx_jmb_prod_idx;
    6838   [ #  #  #  # ]:          0 :         while (sw_idx != hw_idx && budget > 0) {
    6839                 :          0 :                 struct ring_info *ri;
    6840                 :          0 :                 struct tg3_rx_buffer_desc *desc = &tnapi->rx_rcb[sw_idx];
    6841                 :          0 :                 unsigned int len;
    6842                 :          0 :                 struct sk_buff *skb;
    6843                 :          0 :                 dma_addr_t dma_addr;
    6844                 :          0 :                 u32 opaque_key, desc_idx, *post_ptr;
    6845                 :          0 :                 u8 *data;
    6846                 :          0 :                 u64 tstamp = 0;
    6847                 :            : 
    6848                 :          0 :                 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
    6849                 :          0 :                 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
    6850         [ #  # ]:          0 :                 if (opaque_key == RXD_OPAQUE_RING_STD) {
    6851                 :          0 :                         ri = &tp->napi[0].prodring.rx_std_buffers[desc_idx];
    6852                 :          0 :                         dma_addr = dma_unmap_addr(ri, mapping);
    6853                 :          0 :                         data = ri->data;
    6854                 :          0 :                         post_ptr = &std_prod_idx;
    6855                 :          0 :                         rx_std_posted++;
    6856         [ #  # ]:          0 :                 } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
    6857                 :          0 :                         ri = &tp->napi[0].prodring.rx_jmb_buffers[desc_idx];
    6858                 :          0 :                         dma_addr = dma_unmap_addr(ri, mapping);
    6859                 :          0 :                         data = ri->data;
    6860                 :          0 :                         post_ptr = &jmb_prod_idx;
    6861                 :            :                 } else
    6862                 :          0 :                         goto next_pkt_nopost;
    6863                 :            : 
    6864                 :          0 :                 work_mask |= opaque_key;
    6865                 :            : 
    6866         [ #  # ]:          0 :                 if (desc->err_vlan & RXD_ERR_MASK) {
    6867                 :          0 :                 drop_it:
    6868                 :          0 :                         tg3_recycle_rx(tnapi, tpr, opaque_key,
    6869                 :            :                                        desc_idx, *post_ptr);
    6870                 :          0 :                 drop_it_no_recycle:
    6871                 :            :                         /* Other statistics kept track of by card. */
    6872                 :          0 :                         tp->rx_dropped++;
    6873                 :          0 :                         goto next_pkt;
    6874                 :            :                 }
    6875                 :            : 
    6876                 :          0 :                 prefetch(data + TG3_RX_OFFSET(tp));
    6877                 :          0 :                 len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) -
    6878                 :            :                       ETH_FCS_LEN;
    6879                 :            : 
    6880                 :          0 :                 if ((desc->type_flags & RXD_FLAG_PTPSTAT_MASK) ==
    6881         [ #  # ]:          0 :                      RXD_FLAG_PTPSTAT_PTPV1 ||
    6882                 :            :                     (desc->type_flags & RXD_FLAG_PTPSTAT_MASK) ==
    6883                 :            :                      RXD_FLAG_PTPSTAT_PTPV2) {
    6884                 :          0 :                         tstamp = tr32(TG3_RX_TSTAMP_LSB);
    6885                 :          0 :                         tstamp |= (u64)tr32(TG3_RX_TSTAMP_MSB) << 32;
    6886                 :            :                 }
    6887                 :            : 
    6888         [ #  # ]:          0 :                 if (len > TG3_RX_COPY_THRESH(tp)) {
    6889                 :          0 :                         int skb_size;
    6890                 :          0 :                         unsigned int frag_size;
    6891                 :            : 
    6892                 :          0 :                         skb_size = tg3_alloc_rx_data(tp, tpr, opaque_key,
    6893                 :            :                                                     *post_ptr, &frag_size);
    6894         [ #  # ]:          0 :                         if (skb_size < 0)
    6895                 :          0 :                                 goto drop_it;
    6896                 :            : 
    6897                 :          0 :                         pci_unmap_single(tp->pdev, dma_addr, skb_size,
    6898                 :            :                                          PCI_DMA_FROMDEVICE);
    6899                 :            : 
    6900                 :            :                         /* Ensure that the update to the data happens
    6901                 :            :                          * after the usage of the old DMA mapping.
    6902                 :            :                          */
    6903                 :          0 :                         smp_wmb();
    6904                 :            : 
    6905                 :          0 :                         ri->data = NULL;
    6906                 :            : 
    6907                 :          0 :                         skb = build_skb(data, frag_size);
    6908         [ #  # ]:          0 :                         if (!skb) {
    6909         [ #  # ]:          0 :                                 tg3_frag_free(frag_size != 0, data);
    6910                 :          0 :                                 goto drop_it_no_recycle;
    6911                 :            :                         }
    6912                 :          0 :                         skb_reserve(skb, TG3_RX_OFFSET(tp));
    6913                 :            :                 } else {
    6914                 :          0 :                         tg3_recycle_rx(tnapi, tpr, opaque_key,
    6915                 :            :                                        desc_idx, *post_ptr);
    6916                 :            : 
    6917                 :          0 :                         skb = netdev_alloc_skb(tp->dev,
    6918                 :            :                                                len + TG3_RAW_IP_ALIGN);
    6919         [ #  # ]:          0 :                         if (skb == NULL)
    6920                 :          0 :                                 goto drop_it_no_recycle;
    6921                 :            : 
    6922                 :          0 :                         skb_reserve(skb, TG3_RAW_IP_ALIGN);
    6923                 :          0 :                         pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
    6924                 :          0 :                         memcpy(skb->data,
    6925                 :            :                                data + TG3_RX_OFFSET(tp),
    6926                 :            :                                len);
    6927                 :          0 :                         pci_dma_sync_single_for_device(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
    6928                 :            :                 }
    6929                 :            : 
    6930                 :          0 :                 skb_put(skb, len);
    6931         [ #  # ]:          0 :                 if (tstamp)
    6932                 :          0 :                         tg3_hwclock_to_timestamp(tp, tstamp,
    6933                 :            :                                                  skb_hwtstamps(skb));
    6934                 :            : 
    6935         [ #  # ]:          0 :                 if ((tp->dev->features & NETIF_F_RXCSUM) &&
    6936         [ #  # ]:          0 :                     (desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
    6937                 :          0 :                     (((desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
    6938         [ #  # ]:          0 :                       >> RXD_TCPCSUM_SHIFT) == 0xffff))
    6939                 :          0 :                         skb->ip_summed = CHECKSUM_UNNECESSARY;
    6940                 :            :                 else
    6941                 :            :                         skb_checksum_none_assert(skb);
    6942                 :            : 
    6943                 :          0 :                 skb->protocol = eth_type_trans(skb, tp->dev);
    6944                 :            : 
    6945   [ #  #  #  # ]:          0 :                 if (len > (tp->dev->mtu + ETH_HLEN) &&
    6946         [ #  # ]:          0 :                     skb->protocol != htons(ETH_P_8021Q) &&
    6947                 :            :                     skb->protocol != htons(ETH_P_8021AD)) {
    6948                 :          0 :                         dev_kfree_skb_any(skb);
    6949                 :          0 :                         goto drop_it_no_recycle;
    6950                 :            :                 }
    6951                 :            : 
    6952         [ #  # ]:          0 :                 if (desc->type_flags & RXD_FLAG_VLAN &&
    6953         [ #  # ]:          0 :                     !(tp->rx_mode & RX_MODE_KEEP_VLAN_TAG))
    6954                 :          0 :                         __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
    6955                 :          0 :                                                desc->err_vlan & RXD_VLAN_MASK);
    6956                 :            : 
    6957                 :          0 :                 napi_gro_receive(&tnapi->napi, skb);
    6958                 :            : 
    6959                 :          0 :                 received++;
    6960                 :          0 :                 budget--;
    6961                 :            : 
    6962                 :          0 : next_pkt:
    6963                 :          0 :                 (*post_ptr)++;
    6964                 :            : 
    6965         [ #  # ]:          0 :                 if (unlikely(rx_std_posted >= tp->rx_std_max_post)) {
    6966                 :          0 :                         tpr->rx_std_prod_idx = std_prod_idx &
    6967                 :          0 :                                                tp->rx_std_ring_mask;
    6968                 :          0 :                         tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG,
    6969                 :            :                                      tpr->rx_std_prod_idx);
    6970                 :          0 :                         work_mask &= ~RXD_OPAQUE_RING_STD;
    6971                 :          0 :                         rx_std_posted = 0;
    6972                 :            :                 }
    6973                 :          0 : next_pkt_nopost:
    6974                 :          0 :                 sw_idx++;
    6975                 :          0 :                 sw_idx &= tp->rx_ret_ring_mask;
    6976                 :            : 
    6977                 :            :                 /* Refresh hw_idx to see if there is new work */
    6978         [ #  # ]:          0 :                 if (sw_idx == hw_idx) {
    6979                 :          0 :                         hw_idx = *(tnapi->rx_rcb_prod_idx);
    6980                 :          0 :                         rmb();
    6981                 :            :                 }
    6982                 :            :         }
    6983                 :            : 
    6984                 :            :         /* ACK the status ring. */
    6985                 :          0 :         tnapi->rx_rcb_ptr = sw_idx;
    6986                 :          0 :         tw32_rx_mbox(tnapi->consmbox, sw_idx);
    6987                 :            : 
    6988                 :            :         /* Refill RX ring(s). */
    6989         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_RSS)) {
    6990                 :            :                 /* Sync BD data before updating mailbox */
    6991                 :          0 :                 wmb();
    6992                 :            : 
    6993         [ #  # ]:          0 :                 if (work_mask & RXD_OPAQUE_RING_STD) {
    6994                 :          0 :                         tpr->rx_std_prod_idx = std_prod_idx &
    6995                 :          0 :                                                tp->rx_std_ring_mask;
    6996                 :          0 :                         tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG,
    6997                 :            :                                      tpr->rx_std_prod_idx);
    6998                 :            :                 }
    6999         [ #  # ]:          0 :                 if (work_mask & RXD_OPAQUE_RING_JUMBO) {
    7000                 :          0 :                         tpr->rx_jmb_prod_idx = jmb_prod_idx &
    7001                 :          0 :                                                tp->rx_jmb_ring_mask;
    7002                 :          0 :                         tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG,
    7003                 :            :                                      tpr->rx_jmb_prod_idx);
    7004                 :            :                 }
    7005         [ #  # ]:          0 :         } else if (work_mask) {
    7006                 :            :                 /* rx_std_buffers[] and rx_jmb_buffers[] entries must be
    7007                 :            :                  * updated before the producer indices can be updated.
    7008                 :            :                  */
    7009                 :          0 :                 smp_wmb();
    7010                 :            : 
    7011                 :          0 :                 tpr->rx_std_prod_idx = std_prod_idx & tp->rx_std_ring_mask;
    7012                 :          0 :                 tpr->rx_jmb_prod_idx = jmb_prod_idx & tp->rx_jmb_ring_mask;
    7013                 :            : 
    7014         [ #  # ]:          0 :                 if (tnapi != &tp->napi[1]) {
    7015                 :          0 :                         tp->rx_refill = true;
    7016                 :          0 :                         napi_schedule(&tp->napi[1].napi);
    7017                 :            :                 }
    7018                 :            :         }
    7019                 :            : 
    7020                 :          0 :         return received;
    7021                 :            : }
    7022                 :            : 
    7023                 :          0 : static void tg3_poll_link(struct tg3 *tp)
    7024                 :            : {
    7025                 :            :         /* handle link change and other phy events */
    7026   [ #  #  #  # ]:          0 :         if (!(tg3_flag(tp, USE_LINKCHG_REG) || tg3_flag(tp, POLL_SERDES))) {
    7027                 :          0 :                 struct tg3_hw_status *sblk = tp->napi[0].hw_status;
    7028                 :            : 
    7029         [ #  # ]:          0 :                 if (sblk->status & SD_STATUS_LINK_CHG) {
    7030                 :          0 :                         sblk->status = SD_STATUS_UPDATED |
    7031                 :            :                                        (sblk->status & ~SD_STATUS_LINK_CHG);
    7032                 :          0 :                         spin_lock(&tp->lock);
    7033         [ #  # ]:          0 :                         if (tg3_flag(tp, USE_PHYLIB)) {
    7034                 :          0 :                                 tw32_f(MAC_STATUS,
    7035                 :            :                                      (MAC_STATUS_SYNC_CHANGED |
    7036                 :            :                                       MAC_STATUS_CFG_CHANGED |
    7037                 :            :                                       MAC_STATUS_MI_COMPLETION |
    7038                 :            :                                       MAC_STATUS_LNKSTATE_CHANGED));
    7039                 :          0 :                                 udelay(40);
    7040                 :            :                         } else
    7041                 :          0 :                                 tg3_setup_phy(tp, false);
    7042                 :          0 :                         spin_unlock(&tp->lock);
    7043                 :            :                 }
    7044                 :            :         }
    7045                 :          0 : }
    7046                 :            : 
    7047                 :            : static int tg3_rx_prodring_xfer(struct tg3 *tp,
    7048                 :            :                                 struct tg3_rx_prodring_set *dpr,
    7049                 :            :                                 struct tg3_rx_prodring_set *spr)
    7050                 :            : {
    7051                 :            :         u32 si, di, cpycnt, src_prod_idx;
    7052                 :            :         int i, err = 0;
    7053                 :            : 
    7054                 :            :         while (1) {
    7055                 :            :                 src_prod_idx = spr->rx_std_prod_idx;
    7056                 :            : 
    7057                 :            :                 /* Make sure updates to the rx_std_buffers[] entries and the
    7058                 :            :                  * standard producer index are seen in the correct order.
    7059                 :            :                  */
    7060                 :            :                 smp_rmb();
    7061                 :            : 
    7062                 :            :                 if (spr->rx_std_cons_idx == src_prod_idx)
    7063                 :            :                         break;
    7064                 :            : 
    7065                 :            :                 if (spr->rx_std_cons_idx < src_prod_idx)
    7066                 :            :                         cpycnt = src_prod_idx - spr->rx_std_cons_idx;
    7067                 :            :                 else
    7068                 :            :                         cpycnt = tp->rx_std_ring_mask + 1 -
    7069                 :            :                                  spr->rx_std_cons_idx;
    7070                 :            : 
    7071                 :            :                 cpycnt = min(cpycnt,
    7072                 :            :                              tp->rx_std_ring_mask + 1 - dpr->rx_std_prod_idx);
    7073                 :            : 
    7074                 :            :                 si = spr->rx_std_cons_idx;
    7075                 :            :                 di = dpr->rx_std_prod_idx;
    7076                 :            : 
    7077                 :            :                 for (i = di; i < di + cpycnt; i++) {
    7078                 :            :                         if (dpr->rx_std_buffers[i].data) {
    7079                 :            :                                 cpycnt = i - di;
    7080                 :            :                                 err = -ENOSPC;
    7081                 :            :                                 break;
    7082                 :            :                         }
    7083                 :            :                 }
    7084                 :            : 
    7085                 :            :                 if (!cpycnt)
    7086                 :            :                         break;
    7087                 :            : 
    7088                 :            :                 /* Ensure that updates to the rx_std_buffers ring and the
    7089                 :            :                  * shadowed hardware producer ring from tg3_recycle_skb() are
    7090                 :            :                  * ordered correctly WRT the skb check above.
    7091                 :            :                  */
    7092                 :            :                 smp_rmb();
    7093                 :            : 
    7094                 :            :                 memcpy(&dpr->rx_std_buffers[di],
    7095                 :            :                        &spr->rx_std_buffers[si],
    7096                 :            :                        cpycnt * sizeof(struct ring_info));
    7097                 :            : 
    7098                 :            :                 for (i = 0; i < cpycnt; i++, di++, si++) {
    7099                 :            :                         struct tg3_rx_buffer_desc *sbd, *dbd;
    7100                 :            :                         sbd = &spr->rx_std[si];
    7101                 :            :                         dbd = &dpr->rx_std[di];
    7102                 :            :                         dbd->addr_hi = sbd->addr_hi;
    7103                 :            :                         dbd->addr_lo = sbd->addr_lo;
    7104                 :            :                 }
    7105                 :            : 
    7106                 :            :                 spr->rx_std_cons_idx = (spr->rx_std_cons_idx + cpycnt) &
    7107                 :            :                                        tp->rx_std_ring_mask;
    7108                 :            :                 dpr->rx_std_prod_idx = (dpr->rx_std_prod_idx + cpycnt) &
    7109                 :            :                                        tp->rx_std_ring_mask;
    7110                 :            :         }
    7111                 :            : 
    7112                 :            :         while (1) {
    7113                 :            :                 src_prod_idx = spr->rx_jmb_prod_idx;
    7114                 :            : 
    7115                 :            :                 /* Make sure updates to the rx_jmb_buffers[] entries and
    7116                 :            :                  * the jumbo producer index are seen in the correct order.
    7117                 :            :                  */
    7118                 :            :                 smp_rmb();
    7119                 :            : 
    7120                 :            :                 if (spr->rx_jmb_cons_idx == src_prod_idx)
    7121                 :            :                         break;
    7122                 :            : 
    7123                 :            :                 if (spr->rx_jmb_cons_idx < src_prod_idx)
    7124                 :            :                         cpycnt = src_prod_idx - spr->rx_jmb_cons_idx;
    7125                 :            :                 else
    7126                 :            :                         cpycnt = tp->rx_jmb_ring_mask + 1 -
    7127                 :            :                                  spr->rx_jmb_cons_idx;
    7128                 :            : 
    7129                 :            :                 cpycnt = min(cpycnt,
    7130                 :            :                              tp->rx_jmb_ring_mask + 1 - dpr->rx_jmb_prod_idx);
    7131                 :            : 
    7132                 :            :                 si = spr->rx_jmb_cons_idx;
    7133                 :            :                 di = dpr->rx_jmb_prod_idx;
    7134                 :            : 
    7135                 :            :                 for (i = di; i < di + cpycnt; i++) {
    7136                 :            :                         if (dpr->rx_jmb_buffers[i].data) {
    7137                 :            :                                 cpycnt = i - di;
    7138                 :            :                                 err = -ENOSPC;
    7139                 :            :                                 break;
    7140                 :            :                         }
    7141                 :            :                 }
    7142                 :            : 
    7143                 :            :                 if (!cpycnt)
    7144                 :            :                         break;
    7145                 :            : 
    7146                 :            :                 /* Ensure that updates to the rx_jmb_buffers ring and the
    7147                 :            :                  * shadowed hardware producer ring from tg3_recycle_skb() are
    7148                 :            :                  * ordered correctly WRT the skb check above.
    7149                 :            :                  */
    7150                 :            :                 smp_rmb();
    7151                 :            : 
    7152                 :            :                 memcpy(&dpr->rx_jmb_buffers[di],
    7153                 :            :                        &spr->rx_jmb_buffers[si],
    7154                 :            :                        cpycnt * sizeof(struct ring_info));
    7155                 :            : 
    7156                 :            :                 for (i = 0; i < cpycnt; i++, di++, si++) {
    7157                 :            :                         struct tg3_rx_buffer_desc *sbd, *dbd;
    7158                 :            :                         sbd = &spr->rx_jmb[si].std;
    7159                 :            :                         dbd = &dpr->rx_jmb[di].std;
    7160                 :            :                         dbd->addr_hi = sbd->addr_hi;
    7161                 :            :                         dbd->addr_lo = sbd->addr_lo;
    7162                 :            :                 }
    7163                 :            : 
    7164                 :            :                 spr->rx_jmb_cons_idx = (spr->rx_jmb_cons_idx + cpycnt) &
    7165                 :            :                                        tp->rx_jmb_ring_mask;
    7166                 :            :                 dpr->rx_jmb_prod_idx = (dpr->rx_jmb_prod_idx + cpycnt) &
    7167                 :            :                                        tp->rx_jmb_ring_mask;
    7168                 :            :         }
    7169                 :            : 
    7170                 :            :         return err;
    7171                 :            : }
    7172                 :            : 
    7173                 :          0 : static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget)
    7174                 :            : {
    7175                 :          0 :         struct tg3 *tp = tnapi->tp;
    7176                 :            : 
    7177                 :            :         /* run TX completion thread */
    7178         [ #  # ]:          0 :         if (tnapi->hw_status->idx[0].tx_consumer != tnapi->tx_cons) {
    7179                 :          0 :                 tg3_tx(tnapi);
    7180         [ #  # ]:          0 :                 if (unlikely(tg3_flag(tp, TX_RECOVERY_PENDING)))
    7181                 :            :                         return work_done;
    7182                 :            :         }
    7183                 :            : 
    7184         [ #  # ]:          0 :         if (!tnapi->rx_rcb_prod_idx)
    7185                 :            :                 return work_done;
    7186                 :            : 
    7187                 :            :         /* run RX thread, within the bounds set by NAPI.
    7188                 :            :          * All RX "locking" is done by ensuring outside
    7189                 :            :          * code synchronizes with tg3->napi.poll()
    7190                 :            :          */
    7191         [ #  # ]:          0 :         if (*(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr)
    7192                 :          0 :                 work_done += tg3_rx(tnapi, budget - work_done);
    7193                 :            : 
    7194   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, ENABLE_RSS) && tnapi == &tp->napi[1]) {
    7195                 :          0 :                 struct tg3_rx_prodring_set *dpr = &tp->napi[0].prodring;
    7196                 :          0 :                 int i, err = 0;
    7197                 :          0 :                 u32 std_prod_idx = dpr->rx_std_prod_idx;
    7198                 :          0 :                 u32 jmb_prod_idx = dpr->rx_jmb_prod_idx;
    7199                 :            : 
    7200                 :          0 :                 tp->rx_refill = false;
    7201         [ #  # ]:          0 :                 for (i = 1; i <= tp->rxq_cnt; i++)
    7202                 :          0 :                         err |= tg3_rx_prodring_xfer(tp, dpr,
    7203                 :            :                                                     &tp->napi[i].prodring);
    7204                 :            : 
    7205                 :          0 :                 wmb();
    7206                 :            : 
    7207         [ #  # ]:          0 :                 if (std_prod_idx != dpr->rx_std_prod_idx)
    7208                 :          0 :                         tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG,
    7209                 :            :                                      dpr->rx_std_prod_idx);
    7210                 :            : 
    7211         [ #  # ]:          0 :                 if (jmb_prod_idx != dpr->rx_jmb_prod_idx)
    7212                 :          0 :                         tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG,
    7213                 :            :                                      dpr->rx_jmb_prod_idx);
    7214                 :            : 
    7215         [ #  # ]:          0 :                 if (err)
    7216                 :          0 :                         tw32_f(HOSTCC_MODE, tp->coal_now);
    7217                 :            :         }
    7218                 :            : 
    7219                 :            :         return work_done;
    7220                 :            : }
    7221                 :            : 
    7222                 :          0 : static inline void tg3_reset_task_schedule(struct tg3 *tp)
    7223                 :            : {
    7224         [ #  # ]:          0 :         if (!test_and_set_bit(TG3_FLAG_RESET_TASK_PENDING, tp->tg3_flags))
    7225                 :          0 :                 schedule_work(&tp->reset_task);
    7226                 :          0 : }
    7227                 :            : 
    7228                 :          0 : static inline void tg3_reset_task_cancel(struct tg3 *tp)
    7229                 :            : {
    7230                 :          0 :         cancel_work_sync(&tp->reset_task);
    7231                 :          0 :         tg3_flag_clear(tp, RESET_TASK_PENDING);
    7232                 :          0 :         tg3_flag_clear(tp, TX_RECOVERY_PENDING);
    7233                 :          0 : }
    7234                 :            : 
    7235                 :          0 : static int tg3_poll_msix(struct napi_struct *napi, int budget)
    7236                 :            : {
    7237                 :          0 :         struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi);
    7238                 :          0 :         struct tg3 *tp = tnapi->tp;
    7239                 :          0 :         int work_done = 0;
    7240                 :          0 :         struct tg3_hw_status *sblk = tnapi->hw_status;
    7241                 :            : 
    7242                 :          0 :         while (1) {
    7243                 :          0 :                 work_done = tg3_poll_work(tnapi, work_done, budget);
    7244                 :            : 
    7245         [ #  # ]:          0 :                 if (unlikely(tg3_flag(tp, TX_RECOVERY_PENDING)))
    7246                 :          0 :                         goto tx_recovery;
    7247                 :            : 
    7248         [ #  # ]:          0 :                 if (unlikely(work_done >= budget))
    7249                 :            :                         break;
    7250                 :            : 
    7251                 :            :                 /* tp->last_tag is used in tg3_int_reenable() below
    7252                 :            :                  * to tell the hw how much work has been processed,
    7253                 :            :                  * so we must read it before checking for more work.
    7254                 :            :                  */
    7255                 :          0 :                 tnapi->last_tag = sblk->status_tag;
    7256                 :          0 :                 tnapi->last_irq_tag = tnapi->last_tag;
    7257                 :          0 :                 rmb();
    7258                 :            : 
    7259                 :            :                 /* check for RX/TX work to do */
    7260   [ #  #  #  # ]:          0 :                 if (likely(sblk->idx[0].tx_consumer == tnapi->tx_cons &&
    7261                 :            :                            *(tnapi->rx_rcb_prod_idx) == tnapi->rx_rcb_ptr)) {
    7262                 :            : 
    7263                 :            :                         /* This test here is not race free, but will reduce
    7264                 :            :                          * the number of interrupts by looping again.
    7265                 :            :                          */
    7266   [ #  #  #  # ]:          0 :                         if (tnapi == &tp->napi[1] && tp->rx_refill)
    7267                 :          0 :                                 continue;
    7268                 :            : 
    7269                 :          0 :                         napi_complete_done(napi, work_done);
    7270                 :            :                         /* Reenable interrupts. */
    7271                 :          0 :                         tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24);
    7272                 :            : 
    7273                 :            :                         /* This test here is synchronized by napi_schedule()
    7274                 :            :                          * and napi_complete() to close the race condition.
    7275                 :            :                          */
    7276   [ #  #  #  # ]:          0 :                         if (unlikely(tnapi == &tp->napi[1] && tp->rx_refill)) {
    7277                 :          0 :                                 tw32(HOSTCC_MODE, tp->coalesce_mode |
    7278                 :            :                                                   HOSTCC_MODE_ENABLE |
    7279                 :            :                                                   tnapi->coal_now);
    7280                 :            :                         }
    7281                 :            :                         break;
    7282                 :            :                 }
    7283                 :            :         }
    7284                 :            : 
    7285                 :          0 :         tg3_send_ape_heartbeat(tp, TG3_APE_HB_INTERVAL << 1);
    7286                 :          0 :         return work_done;
    7287                 :            : 
    7288                 :            : tx_recovery:
    7289                 :            :         /* work_done is guaranteed to be less than budget. */
    7290                 :          0 :         napi_complete(napi);
    7291                 :          0 :         tg3_reset_task_schedule(tp);
    7292                 :          0 :         return work_done;
    7293                 :            : }
    7294                 :            : 
    7295                 :          0 : static void tg3_process_error(struct tg3 *tp)
    7296                 :            : {
    7297                 :          0 :         u32 val;
    7298                 :          0 :         bool real_error = false;
    7299                 :            : 
    7300         [ #  # ]:          0 :         if (tg3_flag(tp, ERROR_PROCESSED))
    7301                 :            :                 return;
    7302                 :            : 
    7303                 :            :         /* Check Flow Attention register */
    7304                 :          0 :         val = tr32(HOSTCC_FLOW_ATTN);
    7305         [ #  # ]:          0 :         if (val & ~HOSTCC_FLOW_ATTN_MBUF_LWM) {
    7306                 :          0 :                 netdev_err(tp->dev, "FLOW Attention error.  Resetting chip.\n");
    7307                 :          0 :                 real_error = true;
    7308                 :            :         }
    7309                 :            : 
    7310         [ #  # ]:          0 :         if (tr32(MSGINT_STATUS) & ~MSGINT_STATUS_MSI_REQ) {
    7311                 :          0 :                 netdev_err(tp->dev, "MSI Status error.  Resetting chip.\n");
    7312                 :          0 :                 real_error = true;
    7313                 :            :         }
    7314                 :            : 
    7315   [ #  #  #  # ]:          0 :         if (tr32(RDMAC_STATUS) || tr32(WDMAC_STATUS)) {
    7316                 :          0 :                 netdev_err(tp->dev, "DMA Status error.  Resetting chip.\n");
    7317                 :          0 :                 real_error = true;
    7318                 :            :         }
    7319                 :            : 
    7320         [ #  # ]:          0 :         if (!real_error)
    7321                 :            :                 return;
    7322                 :            : 
    7323                 :          0 :         tg3_dump_state(tp);
    7324                 :            : 
    7325                 :          0 :         tg3_flag_set(tp, ERROR_PROCESSED);
    7326                 :          0 :         tg3_reset_task_schedule(tp);
    7327                 :            : }
    7328                 :            : 
    7329                 :          0 : static int tg3_poll(struct napi_struct *napi, int budget)
    7330                 :            : {
    7331                 :          0 :         struct tg3_napi *tnapi = container_of(napi, struct tg3_napi, napi);
    7332                 :          0 :         struct tg3 *tp = tnapi->tp;
    7333                 :          0 :         int work_done = 0;
    7334                 :          0 :         struct tg3_hw_status *sblk = tnapi->hw_status;
    7335                 :            : 
    7336                 :          0 :         while (1) {
    7337         [ #  # ]:          0 :                 if (sblk->status & SD_STATUS_ERROR)
    7338                 :          0 :                         tg3_process_error(tp);
    7339                 :            : 
    7340                 :          0 :                 tg3_poll_link(tp);
    7341                 :            : 
    7342                 :          0 :                 work_done = tg3_poll_work(tnapi, work_done, budget);
    7343                 :            : 
    7344         [ #  # ]:          0 :                 if (unlikely(tg3_flag(tp, TX_RECOVERY_PENDING)))
    7345                 :          0 :                         goto tx_recovery;
    7346                 :            : 
    7347         [ #  # ]:          0 :                 if (unlikely(work_done >= budget))
    7348                 :            :                         break;
    7349                 :            : 
    7350         [ #  # ]:          0 :                 if (tg3_flag(tp, TAGGED_STATUS)) {
    7351                 :            :                         /* tp->last_tag is used in tg3_int_reenable() below
    7352                 :            :                          * to tell the hw how much work has been processed,
    7353                 :            :                          * so we must read it before checking for more work.
    7354                 :            :                          */
    7355                 :          0 :                         tnapi->last_tag = sblk->status_tag;
    7356                 :          0 :                         tnapi->last_irq_tag = tnapi->last_tag;
    7357                 :          0 :                         rmb();
    7358                 :            :                 } else
    7359                 :          0 :                         sblk->status &= ~SD_STATUS_UPDATED;
    7360                 :            : 
    7361         [ #  # ]:          0 :                 if (likely(!tg3_has_work(tnapi))) {
    7362                 :          0 :                         napi_complete_done(napi, work_done);
    7363                 :          0 :                         tg3_int_reenable(tnapi);
    7364                 :          0 :                         break;
    7365                 :            :                 }
    7366                 :            :         }
    7367                 :            : 
    7368                 :          0 :         tg3_send_ape_heartbeat(tp, TG3_APE_HB_INTERVAL << 1);
    7369                 :          0 :         return work_done;
    7370                 :            : 
    7371                 :            : tx_recovery:
    7372                 :            :         /* work_done is guaranteed to be less than budget. */
    7373                 :          0 :         napi_complete(napi);
    7374                 :          0 :         tg3_reset_task_schedule(tp);
    7375                 :          0 :         return work_done;
    7376                 :            : }
    7377                 :            : 
    7378                 :          0 : static void tg3_napi_disable(struct tg3 *tp)
    7379                 :            : {
    7380                 :          0 :         int i;
    7381                 :            : 
    7382   [ #  #  #  # ]:          0 :         for (i = tp->irq_cnt - 1; i >= 0; i--)
    7383                 :          0 :                 napi_disable(&tp->napi[i].napi);
    7384                 :            : }
    7385                 :            : 
    7386                 :          0 : static void tg3_napi_enable(struct tg3 *tp)
    7387                 :            : {
    7388                 :          0 :         int i;
    7389                 :            : 
    7390   [ #  #  #  #  :          0 :         for (i = 0; i < tp->irq_cnt; i++)
          #  #  #  #  #  
                      # ]
    7391                 :          0 :                 napi_enable(&tp->napi[i].napi);
    7392                 :            : }
    7393                 :            : 
    7394                 :          0 : static void tg3_napi_init(struct tg3 *tp)
    7395                 :            : {
    7396                 :          0 :         int i;
    7397                 :            : 
    7398                 :          0 :         netif_napi_add(tp->dev, &tp->napi[0].napi, tg3_poll, 64);
    7399         [ #  # ]:          0 :         for (i = 1; i < tp->irq_cnt; i++)
    7400                 :          0 :                 netif_napi_add(tp->dev, &tp->napi[i].napi, tg3_poll_msix, 64);
    7401                 :          0 : }
    7402                 :            : 
    7403                 :          0 : static void tg3_napi_fini(struct tg3 *tp)
    7404                 :            : {
    7405                 :          0 :         int i;
    7406                 :            : 
    7407   [ #  #  #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++)
    7408                 :          0 :                 netif_napi_del(&tp->napi[i].napi);
    7409                 :            : }
    7410                 :            : 
    7411                 :          0 : static inline void tg3_netif_stop(struct tg3 *tp)
    7412                 :            : {
    7413         [ #  # ]:          0 :         netif_trans_update(tp->dev); /* prevent tx timeout */
    7414                 :          0 :         tg3_napi_disable(tp);
    7415                 :          0 :         netif_carrier_off(tp->dev);
    7416                 :          0 :         netif_tx_disable(tp->dev);
    7417                 :          0 : }
    7418                 :            : 
    7419                 :            : /* tp->lock must be held */
    7420                 :          0 : static inline void tg3_netif_start(struct tg3 *tp)
    7421                 :            : {
    7422                 :          0 :         tg3_ptp_resume(tp);
    7423                 :            : 
    7424                 :            :         /* NOTE: unconditional netif_tx_wake_all_queues is only
    7425                 :            :          * appropriate so long as all callers are assured to
    7426                 :            :          * have free tx slots (such as after tg3_init_hw)
    7427                 :            :          */
    7428                 :          0 :         netif_tx_wake_all_queues(tp->dev);
    7429                 :            : 
    7430         [ #  # ]:          0 :         if (tp->link_up)
    7431                 :          0 :                 netif_carrier_on(tp->dev);
    7432                 :            : 
    7433                 :            :         tg3_napi_enable(tp);
    7434                 :          0 :         tp->napi[0].hw_status->status |= SD_STATUS_UPDATED;
    7435                 :          0 :         tg3_enable_ints(tp);
    7436                 :          0 : }
    7437                 :            : 
    7438                 :          0 : static void tg3_irq_quiesce(struct tg3 *tp)
    7439                 :            :         __releases(tp->lock)
    7440                 :            :         __acquires(tp->lock)
    7441                 :            : {
    7442                 :          0 :         int i;
    7443                 :            : 
    7444         [ #  # ]:          0 :         BUG_ON(tp->irq_sync);
    7445                 :            : 
    7446                 :          0 :         tp->irq_sync = 1;
    7447                 :          0 :         smp_mb();
    7448                 :            : 
    7449                 :          0 :         spin_unlock_bh(&tp->lock);
    7450                 :            : 
    7451         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++)
    7452                 :          0 :                 synchronize_irq(tp->napi[i].irq_vec);
    7453                 :            : 
    7454                 :          0 :         spin_lock_bh(&tp->lock);
    7455                 :          0 : }
    7456                 :            : 
    7457                 :            : /* Fully shutdown all tg3 driver activity elsewhere in the system.
    7458                 :            :  * If irq_sync is non-zero, then the IRQ handler must be synchronized
    7459                 :            :  * with as well.  Most of the time, this is not necessary except when
    7460                 :            :  * shutting down the device.
    7461                 :            :  */
    7462                 :          0 : static inline void tg3_full_lock(struct tg3 *tp, int irq_sync)
    7463                 :            : {
    7464                 :          0 :         spin_lock_bh(&tp->lock);
    7465   [ #  #  #  #  :          0 :         if (irq_sync)
             #  #  #  # ]
    7466                 :          0 :                 tg3_irq_quiesce(tp);
    7467                 :            : }
    7468                 :            : 
    7469                 :          0 : static inline void tg3_full_unlock(struct tg3 *tp)
    7470                 :            : {
    7471                 :          0 :         spin_unlock_bh(&tp->lock);
    7472                 :          0 : }
    7473                 :            : 
    7474                 :            : /* One-shot MSI handler - Chip automatically disables interrupt
    7475                 :            :  * after sending MSI so driver doesn't have to do it.
    7476                 :            :  */
    7477                 :          0 : static irqreturn_t tg3_msi_1shot(int irq, void *dev_id)
    7478                 :            : {
    7479                 :          0 :         struct tg3_napi *tnapi = dev_id;
    7480                 :          0 :         struct tg3 *tp = tnapi->tp;
    7481                 :            : 
    7482                 :          0 :         prefetch(tnapi->hw_status);
    7483         [ #  # ]:          0 :         if (tnapi->rx_rcb)
    7484                 :          0 :                 prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]);
    7485                 :            : 
    7486         [ #  # ]:          0 :         if (likely(!tg3_irq_sync(tp)))
    7487                 :          0 :                 napi_schedule(&tnapi->napi);
    7488                 :            : 
    7489                 :          0 :         return IRQ_HANDLED;
    7490                 :            : }
    7491                 :            : 
    7492                 :            : /* MSI ISR - No need to check for interrupt sharing and no need to
    7493                 :            :  * flush status block and interrupt mailbox. PCI ordering rules
    7494                 :            :  * guarantee that MSI will arrive after the status block.
    7495                 :            :  */
    7496                 :          0 : static irqreturn_t tg3_msi(int irq, void *dev_id)
    7497                 :            : {
    7498                 :          0 :         struct tg3_napi *tnapi = dev_id;
    7499                 :          0 :         struct tg3 *tp = tnapi->tp;
    7500                 :            : 
    7501                 :          0 :         prefetch(tnapi->hw_status);
    7502         [ #  # ]:          0 :         if (tnapi->rx_rcb)
    7503                 :          0 :                 prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]);
    7504                 :            :         /*
    7505                 :            :          * Writing any value to intr-mbox-0 clears PCI INTA# and
    7506                 :            :          * chip-internal interrupt pending events.
    7507                 :            :          * Writing non-zero to intr-mbox-0 additional tells the
    7508                 :            :          * NIC to stop sending us irqs, engaging "in-intr-handler"
    7509                 :            :          * event coalescing.
    7510                 :            :          */
    7511                 :          0 :         tw32_mailbox(tnapi->int_mbox, 0x00000001);
    7512         [ #  # ]:          0 :         if (likely(!tg3_irq_sync(tp)))
    7513                 :          0 :                 napi_schedule(&tnapi->napi);
    7514                 :            : 
    7515                 :          0 :         return IRQ_RETVAL(1);
    7516                 :            : }
    7517                 :            : 
    7518                 :          0 : static irqreturn_t tg3_interrupt(int irq, void *dev_id)
    7519                 :            : {
    7520                 :          0 :         struct tg3_napi *tnapi = dev_id;
    7521                 :          0 :         struct tg3 *tp = tnapi->tp;
    7522                 :          0 :         struct tg3_hw_status *sblk = tnapi->hw_status;
    7523                 :          0 :         unsigned int handled = 1;
    7524                 :            : 
    7525                 :            :         /* In INTx mode, it is possible for the interrupt to arrive at
    7526                 :            :          * the CPU before the status block posted prior to the interrupt.
    7527                 :            :          * Reading the PCI State register will confirm whether the
    7528                 :            :          * interrupt is ours and will flush the status block.
    7529                 :            :          */
    7530         [ #  # ]:          0 :         if (unlikely(!(sblk->status & SD_STATUS_UPDATED))) {
    7531         [ #  # ]:          0 :                 if (tg3_flag(tp, CHIP_RESETTING) ||
    7532         [ #  # ]:          0 :                     (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
    7533                 :          0 :                         handled = 0;
    7534                 :          0 :                         goto out;
    7535                 :            :                 }
    7536                 :            :         }
    7537                 :            : 
    7538                 :            :         /*
    7539                 :            :          * Writing any value to intr-mbox-0 clears PCI INTA# and
    7540                 :            :          * chip-internal interrupt pending events.
    7541                 :            :          * Writing non-zero to intr-mbox-0 additional tells the
    7542                 :            :          * NIC to stop sending us irqs, engaging "in-intr-handler"
    7543                 :            :          * event coalescing.
    7544                 :            :          *
    7545                 :            :          * Flush the mailbox to de-assert the IRQ immediately to prevent
    7546                 :            :          * spurious interrupts.  The flush impacts performance but
    7547                 :            :          * excessive spurious interrupts can be worse in some cases.
    7548                 :            :          */
    7549                 :          0 :         tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
    7550         [ #  # ]:          0 :         if (tg3_irq_sync(tp))
    7551                 :          0 :                 goto out;
    7552                 :          0 :         sblk->status &= ~SD_STATUS_UPDATED;
    7553         [ #  # ]:          0 :         if (likely(tg3_has_work(tnapi))) {
    7554                 :          0 :                 prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]);
    7555                 :          0 :                 napi_schedule(&tnapi->napi);
    7556                 :            :         } else {
    7557                 :            :                 /* No work, shared interrupt perhaps?  re-enable
    7558                 :            :                  * interrupts, and flush that PCI write
    7559                 :            :                  */
    7560                 :          0 :                 tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
    7561                 :            :                                0x00000000);
    7562                 :            :         }
    7563                 :          0 : out:
    7564                 :          0 :         return IRQ_RETVAL(handled);
    7565                 :            : }
    7566                 :            : 
    7567                 :          0 : static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id)
    7568                 :            : {
    7569                 :          0 :         struct tg3_napi *tnapi = dev_id;
    7570                 :          0 :         struct tg3 *tp = tnapi->tp;
    7571                 :          0 :         struct tg3_hw_status *sblk = tnapi->hw_status;
    7572                 :          0 :         unsigned int handled = 1;
    7573                 :            : 
    7574                 :            :         /* In INTx mode, it is possible for the interrupt to arrive at
    7575                 :            :          * the CPU before the status block posted prior to the interrupt.
    7576                 :            :          * Reading the PCI State register will confirm whether the
    7577                 :            :          * interrupt is ours and will flush the status block.
    7578                 :            :          */
    7579         [ #  # ]:          0 :         if (unlikely(sblk->status_tag == tnapi->last_irq_tag)) {
    7580         [ #  # ]:          0 :                 if (tg3_flag(tp, CHIP_RESETTING) ||
    7581         [ #  # ]:          0 :                     (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
    7582                 :          0 :                         handled = 0;
    7583                 :          0 :                         goto out;
    7584                 :            :                 }
    7585                 :            :         }
    7586                 :            : 
    7587                 :            :         /*
    7588                 :            :          * writing any value to intr-mbox-0 clears PCI INTA# and
    7589                 :            :          * chip-internal interrupt pending events.
    7590                 :            :          * writing non-zero to intr-mbox-0 additional tells the
    7591                 :            :          * NIC to stop sending us irqs, engaging "in-intr-handler"
    7592                 :            :          * event coalescing.
    7593                 :            :          *
    7594                 :            :          * Flush the mailbox to de-assert the IRQ immediately to prevent
    7595                 :            :          * spurious interrupts.  The flush impacts performance but
    7596                 :            :          * excessive spurious interrupts can be worse in some cases.
    7597                 :            :          */
    7598                 :          0 :         tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
    7599                 :            : 
    7600                 :            :         /*
    7601                 :            :          * In a shared interrupt configuration, sometimes other devices'
    7602                 :            :          * interrupts will scream.  We record the current status tag here
    7603                 :            :          * so that the above check can report that the screaming interrupts
    7604                 :            :          * are unhandled.  Eventually they will be silenced.
    7605                 :            :          */
    7606                 :          0 :         tnapi->last_irq_tag = sblk->status_tag;
    7607                 :            : 
    7608         [ #  # ]:          0 :         if (tg3_irq_sync(tp))
    7609                 :          0 :                 goto out;
    7610                 :            : 
    7611                 :          0 :         prefetch(&tnapi->rx_rcb[tnapi->rx_rcb_ptr]);
    7612                 :            : 
    7613                 :          0 :         napi_schedule(&tnapi->napi);
    7614                 :            : 
    7615                 :          0 : out:
    7616                 :          0 :         return IRQ_RETVAL(handled);
    7617                 :            : }
    7618                 :            : 
    7619                 :            : /* ISR for interrupt test */
    7620                 :          0 : static irqreturn_t tg3_test_isr(int irq, void *dev_id)
    7621                 :            : {
    7622                 :          0 :         struct tg3_napi *tnapi = dev_id;
    7623                 :          0 :         struct tg3 *tp = tnapi->tp;
    7624                 :          0 :         struct tg3_hw_status *sblk = tnapi->hw_status;
    7625                 :            : 
    7626         [ #  # ]:          0 :         if ((sblk->status & SD_STATUS_UPDATED) ||
    7627         [ #  # ]:          0 :             !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) {
    7628                 :          0 :                 tg3_disable_ints(tp);
    7629                 :          0 :                 return IRQ_RETVAL(1);
    7630                 :            :         }
    7631                 :            :         return IRQ_RETVAL(0);
    7632                 :            : }
    7633                 :            : 
    7634                 :            : #ifdef CONFIG_NET_POLL_CONTROLLER
    7635                 :          0 : static void tg3_poll_controller(struct net_device *dev)
    7636                 :            : {
    7637                 :          0 :         int i;
    7638         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
    7639                 :            : 
    7640         [ #  # ]:          0 :         if (tg3_irq_sync(tp))
    7641                 :            :                 return;
    7642                 :            : 
    7643         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++)
    7644                 :          0 :                 tg3_interrupt(tp->napi[i].irq_vec, &tp->napi[i]);
    7645                 :            : }
    7646                 :            : #endif
    7647                 :            : 
    7648                 :          0 : static void tg3_tx_timeout(struct net_device *dev, unsigned int txqueue)
    7649                 :            : {
    7650         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
    7651                 :            : 
    7652         [ #  # ]:          0 :         if (netif_msg_tx_err(tp)) {
    7653                 :          0 :                 netdev_err(dev, "transmit timed out, resetting\n");
    7654                 :          0 :                 tg3_dump_state(tp);
    7655                 :            :         }
    7656                 :            : 
    7657                 :          0 :         tg3_reset_task_schedule(tp);
    7658                 :          0 : }
    7659                 :            : 
    7660                 :            : /* Test for DMA buffers crossing any 4GB boundaries: 4G, 8G, etc */
    7661                 :          0 : static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
    7662                 :            : {
    7663                 :          0 :         u32 base = (u32) mapping & 0xffffffff;
    7664                 :            : 
    7665                 :          0 :         return base + len + 8 < base;
    7666                 :            : }
    7667                 :            : 
    7668                 :            : /* Test for TSO DMA buffers that cross into regions which are within MSS bytes
    7669                 :            :  * of any 4GB boundaries: 4G, 8G, etc
    7670                 :            :  */
    7671                 :          0 : static inline int tg3_4g_tso_overflow_test(struct tg3 *tp, dma_addr_t mapping,
    7672                 :            :                                            u32 len, u32 mss)
    7673                 :            : {
    7674         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5762 && mss) {
    7675                 :          0 :                 u32 base = (u32) mapping & 0xffffffff;
    7676                 :            : 
    7677                 :          0 :                 return ((base + len + (mss & 0x3fff)) < base);
    7678                 :            :         }
    7679                 :            :         return 0;
    7680                 :            : }
    7681                 :            : 
    7682                 :            : /* Test for DMA addresses > 40-bit */
    7683                 :          0 : static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping,
    7684                 :            :                                           int len)
    7685                 :            : {
    7686                 :            : #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64)
    7687                 :            :         if (tg3_flag(tp, 40BIT_DMA_BUG))
    7688                 :            :                 return ((u64) mapping + len) > DMA_BIT_MASK(40);
    7689                 :            :         return 0;
    7690                 :            : #else
    7691                 :          0 :         return 0;
    7692                 :            : #endif
    7693                 :            : }
    7694                 :            : 
    7695                 :          0 : static inline void tg3_tx_set_bd(struct tg3_tx_buffer_desc *txbd,
    7696                 :            :                                  dma_addr_t mapping, u32 len, u32 flags,
    7697                 :            :                                  u32 mss, u32 vlan)
    7698                 :            : {
    7699                 :          0 :         txbd->addr_hi = ((u64) mapping >> 32);
    7700                 :          0 :         txbd->addr_lo = ((u64) mapping & 0xffffffff);
    7701                 :          0 :         txbd->len_flags = (len << TXD_LEN_SHIFT) | (flags & 0x0000ffff);
    7702                 :          0 :         txbd->vlan_tag = (mss << TXD_MSS_SHIFT) | (vlan << TXD_VLAN_TAG_SHIFT);
    7703                 :            : }
    7704                 :            : 
    7705                 :          0 : static bool tg3_tx_frag_set(struct tg3_napi *tnapi, u32 *entry, u32 *budget,
    7706                 :            :                             dma_addr_t map, u32 len, u32 flags,
    7707                 :            :                             u32 mss, u32 vlan)
    7708                 :            : {
    7709                 :          0 :         struct tg3 *tp = tnapi->tp;
    7710                 :          0 :         bool hwbug = false;
    7711                 :            : 
    7712   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, SHORT_DMA_BUG) && len <= 8)
    7713                 :          0 :                 hwbug = true;
    7714                 :            : 
    7715         [ #  # ]:          0 :         if (tg3_4g_overflow_test(map, len))
    7716                 :          0 :                 hwbug = true;
    7717                 :            : 
    7718   [ #  #  #  # ]:          0 :         if (tg3_4g_tso_overflow_test(tp, map, len, mss))
    7719                 :          0 :                 hwbug = true;
    7720                 :            : 
    7721                 :          0 :         if (tg3_40bit_overflow_test(tp, map, len))
    7722                 :            :                 hwbug = true;
    7723                 :            : 
    7724         [ #  # ]:          0 :         if (tp->dma_limit) {
    7725                 :          0 :                 u32 prvidx = *entry;
    7726                 :          0 :                 u32 tmp_flag = flags & ~TXD_FLAG_END;
    7727   [ #  #  #  # ]:          0 :                 while (len > tp->dma_limit && *budget) {
    7728                 :          0 :                         u32 frag_len = tp->dma_limit;
    7729                 :          0 :                         len -= tp->dma_limit;
    7730                 :            : 
    7731                 :            :                         /* Avoid the 8byte DMA problem */
    7732         [ #  # ]:          0 :                         if (len <= 8) {
    7733                 :          0 :                                 len += tp->dma_limit / 2;
    7734                 :          0 :                                 frag_len = tp->dma_limit / 2;
    7735                 :            :                         }
    7736                 :            : 
    7737                 :          0 :                         tnapi->tx_buffers[*entry].fragmented = true;
    7738                 :            : 
    7739                 :          0 :                         tg3_tx_set_bd(&tnapi->tx_ring[*entry], map,
    7740                 :            :                                       frag_len, tmp_flag, mss, vlan);
    7741                 :          0 :                         *budget -= 1;
    7742                 :          0 :                         prvidx = *entry;
    7743                 :          0 :                         *entry = NEXT_TX(*entry);
    7744                 :            : 
    7745                 :          0 :                         map += frag_len;
    7746                 :            :                 }
    7747                 :            : 
    7748         [ #  # ]:          0 :                 if (len) {
    7749         [ #  # ]:          0 :                         if (*budget) {
    7750                 :          0 :                                 tg3_tx_set_bd(&tnapi->tx_ring[*entry], map,
    7751                 :            :                                               len, flags, mss, vlan);
    7752                 :          0 :                                 *budget -= 1;
    7753                 :          0 :                                 *entry = NEXT_TX(*entry);
    7754                 :            :                         } else {
    7755                 :          0 :                                 hwbug = true;
    7756                 :          0 :                                 tnapi->tx_buffers[prvidx].fragmented = false;
    7757                 :            :                         }
    7758                 :            :                 }
    7759                 :            :         } else {
    7760                 :          0 :                 tg3_tx_set_bd(&tnapi->tx_ring[*entry], map,
    7761                 :            :                               len, flags, mss, vlan);
    7762                 :          0 :                 *entry = NEXT_TX(*entry);
    7763                 :            :         }
    7764                 :            : 
    7765                 :          0 :         return hwbug;
    7766                 :            : }
    7767                 :            : 
    7768                 :            : static void tg3_tx_skb_unmap(struct tg3_napi *tnapi, u32 entry, int last)
    7769                 :            : {
    7770                 :            :         int i;
    7771                 :            :         struct sk_buff *skb;
    7772                 :            :         struct tg3_tx_ring_info *txb = &tnapi->tx_buffers[entry];
    7773                 :            : 
    7774                 :            :         skb = txb->skb;
    7775                 :            :         txb->skb = NULL;
    7776                 :            : 
    7777                 :            :         pci_unmap_single(tnapi->tp->pdev,
    7778                 :            :                          dma_unmap_addr(txb, mapping),
    7779                 :            :                          skb_headlen(skb),
    7780                 :            :                          PCI_DMA_TODEVICE);
    7781                 :            : 
    7782                 :            :         while (txb->fragmented) {
    7783                 :            :                 txb->fragmented = false;
    7784                 :            :                 entry = NEXT_TX(entry);
    7785                 :            :                 txb = &tnapi->tx_buffers[entry];
    7786                 :            :         }
    7787                 :            : 
    7788                 :            :         for (i = 0; i <= last; i++) {
    7789                 :            :                 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
    7790                 :            : 
    7791                 :            :                 entry = NEXT_TX(entry);
    7792                 :            :                 txb = &tnapi->tx_buffers[entry];
    7793                 :            : 
    7794                 :            :                 pci_unmap_page(tnapi->tp->pdev,
    7795                 :            :                                dma_unmap_addr(txb, mapping),
    7796                 :            :                                skb_frag_size(frag), PCI_DMA_TODEVICE);
    7797                 :            : 
    7798                 :            :                 while (txb->fragmented) {
    7799                 :            :                         txb->fragmented = false;
    7800                 :            :                         entry = NEXT_TX(entry);
    7801                 :            :                         txb = &tnapi->tx_buffers[entry];
    7802                 :            :                 }
    7803                 :            :         }
    7804                 :            : }
    7805                 :            : 
    7806                 :            : /* Workaround 4GB and 40-bit hardware DMA bugs. */
    7807                 :          0 : static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi,
    7808                 :            :                                        struct sk_buff **pskb,
    7809                 :            :                                        u32 *entry, u32 *budget,
    7810                 :            :                                        u32 base_flags, u32 mss, u32 vlan)
    7811                 :            : {
    7812                 :          0 :         struct tg3 *tp = tnapi->tp;
    7813                 :          0 :         struct sk_buff *new_skb, *skb = *pskb;
    7814                 :          0 :         dma_addr_t new_addr = 0;
    7815                 :          0 :         int ret = 0;
    7816                 :            : 
    7817         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5701)
    7818                 :          0 :                 new_skb = skb_copy(skb, GFP_ATOMIC);
    7819                 :            :         else {
    7820                 :          0 :                 int more_headroom = 4 - ((unsigned long)skb->data & 3);
    7821                 :            : 
    7822         [ #  # ]:          0 :                 new_skb = skb_copy_expand(skb,
    7823                 :          0 :                                           skb_headroom(skb) + more_headroom,
    7824                 :            :                                           skb_tailroom(skb), GFP_ATOMIC);
    7825                 :            :         }
    7826                 :            : 
    7827         [ #  # ]:          0 :         if (!new_skb) {
    7828                 :            :                 ret = -1;
    7829                 :            :         } else {
    7830                 :            :                 /* New SKB is guaranteed to be linear. */
    7831                 :          0 :                 new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
    7832                 :            :                                           PCI_DMA_TODEVICE);
    7833                 :            :                 /* Make sure the mapping succeeded */
    7834                 :          0 :                 if (pci_dma_mapping_error(tp->pdev, new_addr)) {
    7835                 :          0 :                         dev_kfree_skb_any(new_skb);
    7836                 :          0 :                         ret = -1;
    7837                 :            :                 } else {
    7838                 :          0 :                         u32 save_entry = *entry;
    7839                 :            : 
    7840                 :          0 :                         base_flags |= TXD_FLAG_END;
    7841                 :            : 
    7842                 :          0 :                         tnapi->tx_buffers[*entry].skb = new_skb;
    7843                 :          0 :                         dma_unmap_addr_set(&tnapi->tx_buffers[*entry],
    7844                 :            :                                            mapping, new_addr);
    7845                 :            : 
    7846         [ #  # ]:          0 :                         if (tg3_tx_frag_set(tnapi, entry, budget, new_addr,
    7847                 :            :                                             new_skb->len, base_flags,
    7848                 :            :                                             mss, vlan)) {
    7849                 :          0 :                                 tg3_tx_skb_unmap(tnapi, save_entry, -1);
    7850                 :          0 :                                 dev_kfree_skb_any(new_skb);
    7851                 :          0 :                                 ret = -1;
    7852                 :            :                         }
    7853                 :            :                 }
    7854                 :            :         }
    7855                 :            : 
    7856                 :          0 :         dev_consume_skb_any(skb);
    7857                 :          0 :         *pskb = new_skb;
    7858                 :          0 :         return ret;
    7859                 :            : }
    7860                 :            : 
    7861                 :          0 : static bool tg3_tso_bug_gso_check(struct tg3_napi *tnapi, struct sk_buff *skb)
    7862                 :            : {
    7863                 :            :         /* Check if we will never have enough descriptors,
    7864                 :            :          * as gso_segs can be more than current ring size
    7865                 :            :          */
    7866                 :          0 :         return skb_shinfo(skb)->gso_segs < tnapi->tx_pending / 3;
    7867                 :            : }
    7868                 :            : 
    7869                 :            : static netdev_tx_t tg3_start_xmit(struct sk_buff *, struct net_device *);
    7870                 :            : 
    7871                 :            : /* Use GSO to workaround all TSO packets that meet HW bug conditions
    7872                 :            :  * indicated in tg3_tx_frag_set()
    7873                 :            :  */
    7874                 :            : static int tg3_tso_bug(struct tg3 *tp, struct tg3_napi *tnapi,
    7875                 :            :                        struct netdev_queue *txq, struct sk_buff *skb)
    7876                 :            : {
    7877                 :            :         u32 frag_cnt_est = skb_shinfo(skb)->gso_segs * 3;
    7878                 :            :         struct sk_buff *segs, *seg, *next;
    7879                 :            : 
    7880                 :            :         /* Estimate the number of fragments in the worst case */
    7881                 :            :         if (unlikely(tg3_tx_avail(tnapi) <= frag_cnt_est)) {
    7882                 :            :                 netif_tx_stop_queue(txq);
    7883                 :            : 
    7884                 :            :                 /* netif_tx_stop_queue() must be done before checking
    7885                 :            :                  * checking tx index in tg3_tx_avail() below, because in
    7886                 :            :                  * tg3_tx(), we update tx index before checking for
    7887                 :            :                  * netif_tx_queue_stopped().
    7888                 :            :                  */
    7889                 :            :                 smp_mb();
    7890                 :            :                 if (tg3_tx_avail(tnapi) <= frag_cnt_est)
    7891                 :            :                         return NETDEV_TX_BUSY;
    7892                 :            : 
    7893                 :            :                 netif_tx_wake_queue(txq);
    7894                 :            :         }
    7895                 :            : 
    7896                 :            :         segs = skb_gso_segment(skb, tp->dev->features &
    7897                 :            :                                     ~(NETIF_F_TSO | NETIF_F_TSO6));
    7898                 :            :         if (IS_ERR(segs) || !segs)
    7899                 :            :                 goto tg3_tso_bug_end;
    7900                 :            : 
    7901                 :            :         skb_list_walk_safe(segs, seg, next) {
    7902                 :            :                 skb_mark_not_on_list(seg);
    7903                 :            :                 tg3_start_xmit(seg, tp->dev);
    7904                 :            :         }
    7905                 :            : 
    7906                 :            : tg3_tso_bug_end:
    7907                 :            :         dev_consume_skb_any(skb);
    7908                 :            : 
    7909                 :            :         return NETDEV_TX_OK;
    7910                 :            : }
    7911                 :            : 
    7912                 :            : /* hard_start_xmit for all devices */
    7913                 :          0 : static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
    7914                 :            : {
    7915                 :          0 :         struct tg3 *tp = netdev_priv(dev);
    7916                 :          0 :         u32 len, entry, base_flags, mss, vlan = 0;
    7917                 :          0 :         u32 budget;
    7918                 :          0 :         int i = -1, would_hit_hwbug;
    7919                 :          0 :         dma_addr_t mapping;
    7920                 :          0 :         struct tg3_napi *tnapi;
    7921                 :          0 :         struct netdev_queue *txq;
    7922                 :          0 :         unsigned int last;
    7923                 :          0 :         struct iphdr *iph = NULL;
    7924                 :          0 :         struct tcphdr *tcph = NULL;
    7925                 :          0 :         __sum16 tcp_csum = 0, ip_csum = 0;
    7926                 :          0 :         __be16 ip_tot_len = 0;
    7927                 :            : 
    7928                 :          0 :         txq = netdev_get_tx_queue(dev, skb_get_queue_mapping(skb));
    7929                 :          0 :         tnapi = &tp->napi[skb_get_queue_mapping(skb)];
    7930         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_TSS))
    7931                 :          0 :                 tnapi++;
    7932                 :            : 
    7933                 :          0 :         budget = tg3_tx_avail(tnapi);
    7934                 :            : 
    7935                 :            :         /* We are running in BH disabled context with netif_tx_lock
    7936                 :            :          * and TX reclaim runs via tp->napi.poll inside of a software
    7937                 :            :          * interrupt.  Furthermore, IRQ processing runs lockless so we have
    7938                 :            :          * no IRQ context deadlocks to worry about either.  Rejoice!
    7939                 :            :          */
    7940         [ #  # ]:          0 :         if (unlikely(budget <= (skb_shinfo(skb)->nr_frags + 1))) {
    7941         [ #  # ]:          0 :                 if (!netif_tx_queue_stopped(txq)) {
    7942                 :          0 :                         netif_tx_stop_queue(txq);
    7943                 :            : 
    7944                 :            :                         /* This is a hard error, log it. */
    7945                 :          0 :                         netdev_err(dev,
    7946                 :            :                                    "BUG! Tx Ring full when queue awake!\n");
    7947                 :            :                 }
    7948                 :          0 :                 return NETDEV_TX_BUSY;
    7949                 :            :         }
    7950                 :            : 
    7951                 :          0 :         entry = tnapi->tx_prod;
    7952                 :          0 :         base_flags = 0;
    7953                 :            : 
    7954         [ #  # ]:          0 :         mss = skb_shinfo(skb)->gso_size;
    7955         [ #  # ]:          0 :         if (mss) {
    7956                 :          0 :                 u32 tcp_opt_len, hdr_len;
    7957                 :            : 
    7958         [ #  # ]:          0 :                 if (skb_cow_head(skb, 0))
    7959                 :          0 :                         goto drop;
    7960                 :            : 
    7961         [ #  # ]:          0 :                 iph = ip_hdr(skb);
    7962         [ #  # ]:          0 :                 tcp_opt_len = tcp_optlen(skb);
    7963                 :            : 
    7964         [ #  # ]:          0 :                 hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN;
    7965                 :            : 
    7966                 :            :                 /* HW/FW can not correctly segment packets that have been
    7967                 :            :                  * vlan encapsulated.
    7968                 :            :                  */
    7969         [ #  # ]:          0 :                 if (skb->protocol == htons(ETH_P_8021Q) ||
    7970                 :            :                     skb->protocol == htons(ETH_P_8021AD)) {
    7971         [ #  # ]:          0 :                         if (tg3_tso_bug_gso_check(tnapi, skb))
    7972                 :          0 :                                 return tg3_tso_bug(tp, tnapi, txq, skb);
    7973                 :          0 :                         goto drop;
    7974                 :            :                 }
    7975                 :            : 
    7976         [ #  # ]:          0 :                 if (!skb_is_gso_v6(skb)) {
    7977   [ #  #  #  # ]:          0 :                         if (unlikely((ETH_HLEN + hdr_len) > 80) &&
    7978                 :            :                             tg3_flag(tp, TSO_BUG)) {
    7979         [ #  # ]:          0 :                                 if (tg3_tso_bug_gso_check(tnapi, skb))
    7980                 :          0 :                                         return tg3_tso_bug(tp, tnapi, txq, skb);
    7981                 :          0 :                                 goto drop;
    7982                 :            :                         }
    7983                 :          0 :                         ip_csum = iph->check;
    7984                 :          0 :                         ip_tot_len = iph->tot_len;
    7985                 :          0 :                         iph->check = 0;
    7986                 :          0 :                         iph->tot_len = htons(mss + hdr_len);
    7987                 :            :                 }
    7988                 :            : 
    7989                 :          0 :                 base_flags |= (TXD_FLAG_CPU_PRE_DMA |
    7990                 :            :                                TXD_FLAG_CPU_POST_DMA);
    7991                 :            : 
    7992                 :          0 :                 tcph = tcp_hdr(skb);
    7993                 :          0 :                 tcp_csum = tcph->check;
    7994                 :            : 
    7995   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, HW_TSO_1) ||
    7996         [ #  # ]:          0 :                     tg3_flag(tp, HW_TSO_2) ||
    7997                 :            :                     tg3_flag(tp, HW_TSO_3)) {
    7998                 :          0 :                         tcph->check = 0;
    7999                 :          0 :                         base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
    8000                 :            :                 } else {
    8001                 :          0 :                         tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
    8002                 :            :                                                          0, IPPROTO_TCP, 0);
    8003                 :            :                 }
    8004                 :            : 
    8005         [ #  # ]:          0 :                 if (tg3_flag(tp, HW_TSO_3)) {
    8006                 :          0 :                         mss |= (hdr_len & 0xc) << 12;
    8007         [ #  # ]:          0 :                         if (hdr_len & 0x10)
    8008                 :          0 :                                 base_flags |= 0x00000010;
    8009                 :          0 :                         base_flags |= (hdr_len & 0x3e0) << 5;
    8010         [ #  # ]:          0 :                 } else if (tg3_flag(tp, HW_TSO_2))
    8011                 :          0 :                         mss |= hdr_len << 9;
    8012         [ #  # ]:          0 :                 else if (tg3_flag(tp, HW_TSO_1) ||
    8013         [ #  # ]:          0 :                          tg3_asic_rev(tp) == ASIC_REV_5705) {
    8014   [ #  #  #  # ]:          0 :                         if (tcp_opt_len || iph->ihl > 5) {
    8015                 :          0 :                                 int tsflags;
    8016                 :            : 
    8017                 :          0 :                                 tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2);
    8018                 :          0 :                                 mss |= (tsflags << 11);
    8019                 :            :                         }
    8020                 :            :                 } else {
    8021   [ #  #  #  # ]:          0 :                         if (tcp_opt_len || iph->ihl > 5) {
    8022                 :          0 :                                 int tsflags;
    8023                 :            : 
    8024                 :          0 :                                 tsflags = (iph->ihl - 5) + (tcp_opt_len >> 2);
    8025                 :          0 :                                 base_flags |= tsflags << 12;
    8026                 :            :                         }
    8027                 :            :                 }
    8028         [ #  # ]:          0 :         } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
    8029                 :            :                 /* HW/FW can not correctly checksum packets that have been
    8030                 :            :                  * vlan encapsulated.
    8031                 :            :                  */
    8032         [ #  # ]:          0 :                 if (skb->protocol == htons(ETH_P_8021Q) ||
    8033                 :            :                     skb->protocol == htons(ETH_P_8021AD)) {
    8034         [ #  # ]:          0 :                         if (skb_checksum_help(skb))
    8035                 :          0 :                                 goto drop;
    8036                 :            :                 } else  {
    8037                 :            :                         base_flags |= TXD_FLAG_TCPUDP_CSUM;
    8038                 :            :                 }
    8039                 :            :         }
    8040                 :            : 
    8041   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&
    8042         [ #  # ]:          0 :             !mss && skb->len > VLAN_ETH_FRAME_LEN)
    8043                 :          0 :                 base_flags |= TXD_FLAG_JMB_PKT;
    8044                 :            : 
    8045         [ #  # ]:          0 :         if (skb_vlan_tag_present(skb)) {
    8046                 :          0 :                 base_flags |= TXD_FLAG_VLAN;
    8047                 :          0 :                 vlan = skb_vlan_tag_get(skb);
    8048                 :            :         }
    8049                 :            : 
    8050   [ #  #  #  # ]:          0 :         if ((unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) &&
    8051                 :            :             tg3_flag(tp, TX_TSTAMP_EN)) {
    8052                 :          0 :                 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
    8053                 :          0 :                 base_flags |= TXD_FLAG_HWTSTAMP;
    8054                 :            :         }
    8055                 :            : 
    8056                 :          0 :         len = skb_headlen(skb);
    8057                 :            : 
    8058                 :          0 :         mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
    8059                 :          0 :         if (pci_dma_mapping_error(tp->pdev, mapping))
    8060                 :          0 :                 goto drop;
    8061                 :            : 
    8062                 :            : 
    8063                 :          0 :         tnapi->tx_buffers[entry].skb = skb;
    8064                 :          0 :         dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping, mapping);
    8065                 :            : 
    8066                 :          0 :         would_hit_hwbug = 0;
    8067                 :            : 
    8068         [ #  # ]:          0 :         if (tg3_flag(tp, 5701_DMA_BUG))
    8069                 :          0 :                 would_hit_hwbug = 1;
    8070                 :            : 
    8071         [ #  # ]:          0 :         if (tg3_tx_frag_set(tnapi, &entry, &budget, mapping, len, base_flags |
    8072         [ #  # ]:          0 :                           ((skb_shinfo(skb)->nr_frags == 0) ? TXD_FLAG_END : 0),
    8073                 :            :                             mss, vlan)) {
    8074                 :            :                 would_hit_hwbug = 1;
    8075         [ #  # ]:          0 :         } else if (skb_shinfo(skb)->nr_frags > 0) {
    8076                 :          0 :                 u32 tmp_mss = mss;
    8077                 :            : 
    8078   [ #  #  #  # ]:          0 :                 if (!tg3_flag(tp, HW_TSO_1) &&
    8079         [ #  # ]:          0 :                     !tg3_flag(tp, HW_TSO_2) &&
    8080                 :            :                     !tg3_flag(tp, HW_TSO_3))
    8081                 :          0 :                         tmp_mss = 0;
    8082                 :            : 
    8083                 :            :                 /* Now loop through additional data
    8084                 :            :                  * fragments, and queue them.
    8085                 :            :                  */
    8086                 :          0 :                 last = skb_shinfo(skb)->nr_frags - 1;
    8087         [ #  # ]:          0 :                 for (i = 0; i <= last; i++) {
    8088                 :          0 :                         skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
    8089                 :            : 
    8090                 :          0 :                         len = skb_frag_size(frag);
    8091                 :          0 :                         mapping = skb_frag_dma_map(&tp->pdev->dev, frag, 0,
    8092                 :            :                                                    len, DMA_TO_DEVICE);
    8093                 :            : 
    8094                 :          0 :                         tnapi->tx_buffers[entry].skb = NULL;
    8095                 :          0 :                         dma_unmap_addr_set(&tnapi->tx_buffers[entry], mapping,
    8096                 :            :                                            mapping);
    8097                 :          0 :                         if (dma_mapping_error(&tp->pdev->dev, mapping))
    8098                 :          0 :                                 goto dma_error;
    8099                 :            : 
    8100   [ #  #  #  # ]:          0 :                         if (!budget ||
    8101                 :          0 :                             tg3_tx_frag_set(tnapi, &entry, &budget, mapping,
    8102                 :            :                                             len, base_flags |
    8103         [ #  # ]:          0 :                                             ((i == last) ? TXD_FLAG_END : 0),
    8104                 :            :                                             tmp_mss, vlan)) {
    8105                 :            :                                 would_hit_hwbug = 1;
    8106                 :            :                                 break;
    8107                 :            :                         }
    8108                 :            :                 }
    8109                 :            :         }
    8110                 :            : 
    8111         [ #  # ]:          0 :         if (would_hit_hwbug) {
    8112                 :          0 :                 tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, i);
    8113                 :            : 
    8114   [ #  #  #  # ]:          0 :                 if (mss && tg3_tso_bug_gso_check(tnapi, skb)) {
    8115                 :            :                         /* If it's a TSO packet, do GSO instead of
    8116                 :            :                          * allocating and copying to a large linear SKB
    8117                 :            :                          */
    8118         [ #  # ]:          0 :                         if (ip_tot_len) {
    8119                 :          0 :                                 iph->check = ip_csum;
    8120                 :          0 :                                 iph->tot_len = ip_tot_len;
    8121                 :            :                         }
    8122                 :          0 :                         tcph->check = tcp_csum;
    8123                 :          0 :                         return tg3_tso_bug(tp, tnapi, txq, skb);
    8124                 :            :                 }
    8125                 :            : 
    8126                 :            :                 /* If the workaround fails due to memory/mapping
    8127                 :            :                  * failure, silently drop this packet.
    8128                 :            :                  */
    8129                 :          0 :                 entry = tnapi->tx_prod;
    8130                 :          0 :                 budget = tg3_tx_avail(tnapi);
    8131         [ #  # ]:          0 :                 if (tigon3_dma_hwbug_workaround(tnapi, &skb, &entry, &budget,
    8132                 :            :                                                 base_flags, mss, vlan))
    8133                 :          0 :                         goto drop_nofree;
    8134                 :            :         }
    8135                 :            : 
    8136         [ #  # ]:          0 :         skb_tx_timestamp(skb);
    8137                 :          0 :         netdev_tx_sent_queue(txq, skb->len);
    8138                 :            : 
    8139                 :            :         /* Sync BD data before updating mailbox */
    8140                 :          0 :         wmb();
    8141                 :            : 
    8142                 :          0 :         tnapi->tx_prod = entry;
    8143         [ #  # ]:          0 :         if (unlikely(tg3_tx_avail(tnapi) <= (MAX_SKB_FRAGS + 1))) {
    8144                 :          0 :                 netif_tx_stop_queue(txq);
    8145                 :            : 
    8146                 :            :                 /* netif_tx_stop_queue() must be done before checking
    8147                 :            :                  * checking tx index in tg3_tx_avail() below, because in
    8148                 :            :                  * tg3_tx(), we update tx index before checking for
    8149                 :            :                  * netif_tx_queue_stopped().
    8150                 :            :                  */
    8151                 :          0 :                 smp_mb();
    8152         [ #  # ]:          0 :                 if (tg3_tx_avail(tnapi) > TG3_TX_WAKEUP_THRESH(tnapi))
    8153                 :          0 :                         netif_tx_wake_queue(txq);
    8154                 :            :         }
    8155                 :            : 
    8156   [ #  #  #  # ]:          0 :         if (!netdev_xmit_more() || netif_xmit_stopped(txq)) {
    8157                 :            :                 /* Packets are ready, update Tx producer idx on card. */
    8158                 :          0 :                 tw32_tx_mbox(tnapi->prodmbox, entry);
    8159                 :            :         }
    8160                 :            : 
    8161                 :            :         return NETDEV_TX_OK;
    8162                 :            : 
    8163                 :            : dma_error:
    8164                 :          0 :         tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, --i);
    8165                 :          0 :         tnapi->tx_buffers[tnapi->tx_prod].skb = NULL;
    8166                 :          0 : drop:
    8167                 :          0 :         dev_kfree_skb_any(skb);
    8168                 :          0 : drop_nofree:
    8169                 :          0 :         tp->tx_dropped++;
    8170                 :          0 :         return NETDEV_TX_OK;
    8171                 :            : }
    8172                 :            : 
    8173                 :          0 : static void tg3_mac_loopback(struct tg3 *tp, bool enable)
    8174                 :            : {
    8175         [ #  # ]:          0 :         if (enable) {
    8176                 :          0 :                 tp->mac_mode &= ~(MAC_MODE_HALF_DUPLEX |
    8177                 :            :                                   MAC_MODE_PORT_MODE_MASK);
    8178                 :            : 
    8179                 :          0 :                 tp->mac_mode |= MAC_MODE_PORT_INT_LPBACK;
    8180                 :            : 
    8181         [ #  # ]:          0 :                 if (!tg3_flag(tp, 5705_PLUS))
    8182                 :          0 :                         tp->mac_mode |= MAC_MODE_LINK_POLARITY;
    8183                 :            : 
    8184         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
    8185                 :          0 :                         tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
    8186                 :            :                 else
    8187                 :          0 :                         tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
    8188                 :            :         } else {
    8189                 :          0 :                 tp->mac_mode &= ~MAC_MODE_PORT_INT_LPBACK;
    8190                 :            : 
    8191         [ #  # ]:          0 :                 if (tg3_flag(tp, 5705_PLUS) ||
    8192         [ #  # ]:          0 :                     (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) ||
    8193         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5700)
    8194                 :          0 :                         tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
    8195                 :            :         }
    8196                 :            : 
    8197                 :          0 :         tw32(MAC_MODE, tp->mac_mode);
    8198                 :          0 :         udelay(40);
    8199                 :          0 : }
    8200                 :            : 
    8201                 :          0 : static int tg3_phy_lpbk_set(struct tg3 *tp, u32 speed, bool extlpbk)
    8202                 :            : {
    8203                 :          0 :         u32 val, bmcr, mac_mode, ptest = 0;
    8204                 :            : 
    8205                 :          0 :         tg3_phy_toggle_apd(tp, false);
    8206                 :          0 :         tg3_phy_toggle_automdix(tp, false);
    8207                 :            : 
    8208   [ #  #  #  # ]:          0 :         if (extlpbk && tg3_phy_set_extloopbk(tp))
    8209                 :            :                 return -EIO;
    8210                 :            : 
    8211                 :          0 :         bmcr = BMCR_FULLDPLX;
    8212      [ #  #  # ]:          0 :         switch (speed) {
    8213                 :            :         case SPEED_10:
    8214                 :            :                 break;
    8215                 :          0 :         case SPEED_100:
    8216                 :          0 :                 bmcr |= BMCR_SPEED100;
    8217                 :          0 :                 break;
    8218                 :          0 :         case SPEED_1000:
    8219                 :            :         default:
    8220         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
    8221                 :          0 :                         speed = SPEED_100;
    8222                 :          0 :                         bmcr |= BMCR_SPEED100;
    8223                 :            :                 } else {
    8224                 :          0 :                         speed = SPEED_1000;
    8225                 :          0 :                         bmcr |= BMCR_SPEED1000;
    8226                 :            :                 }
    8227                 :            :         }
    8228                 :            : 
    8229         [ #  # ]:          0 :         if (extlpbk) {
    8230         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_IS_FET)) {
    8231                 :          0 :                         tg3_readphy(tp, MII_CTRL1000, &val);
    8232                 :          0 :                         val |= CTL1000_AS_MASTER |
    8233                 :            :                                CTL1000_ENABLE_MASTER;
    8234                 :          0 :                         tg3_writephy(tp, MII_CTRL1000, val);
    8235                 :            :                 } else {
    8236                 :          0 :                         ptest = MII_TG3_FET_PTEST_TRIM_SEL |
    8237                 :            :                                 MII_TG3_FET_PTEST_TRIM_2;
    8238                 :          0 :                         tg3_writephy(tp, MII_TG3_FET_PTEST, ptest);
    8239                 :            :                 }
    8240                 :            :         } else
    8241                 :          0 :                 bmcr |= BMCR_LOOPBACK;
    8242                 :            : 
    8243                 :          0 :         tg3_writephy(tp, MII_BMCR, bmcr);
    8244                 :            : 
    8245                 :            :         /* The write needs to be flushed for the FETs */
    8246         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_FET)
    8247                 :          0 :                 tg3_readphy(tp, MII_BMCR, &bmcr);
    8248                 :            : 
    8249                 :          0 :         udelay(40);
    8250                 :            : 
    8251         [ #  # ]:          0 :         if ((tp->phy_flags & TG3_PHYFLG_IS_FET) &&
    8252         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5785) {
    8253                 :          0 :                 tg3_writephy(tp, MII_TG3_FET_PTEST, ptest |
    8254                 :            :                              MII_TG3_FET_PTEST_FRC_TX_LINK |
    8255                 :            :                              MII_TG3_FET_PTEST_FRC_TX_LOCK);
    8256                 :            : 
    8257                 :            :                 /* The write needs to be flushed for the AC131 */
    8258                 :          0 :                 tg3_readphy(tp, MII_TG3_FET_PTEST, &val);
    8259                 :            :         }
    8260                 :            : 
    8261                 :            :         /* Reset to prevent losing 1st rx packet intermittently */
    8262   [ #  #  #  # ]:          0 :         if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) &&
    8263                 :          0 :             tg3_flag(tp, 5780_CLASS)) {
    8264                 :          0 :                 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
    8265                 :          0 :                 udelay(10);
    8266                 :          0 :                 tw32_f(MAC_RX_MODE, tp->rx_mode);
    8267                 :            :         }
    8268                 :            : 
    8269                 :          0 :         mac_mode = tp->mac_mode &
    8270                 :            :                    ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX);
    8271         [ #  # ]:          0 :         if (speed == SPEED_1000)
    8272                 :          0 :                 mac_mode |= MAC_MODE_PORT_MODE_GMII;
    8273                 :            :         else
    8274                 :          0 :                 mac_mode |= MAC_MODE_PORT_MODE_MII;
    8275                 :            : 
    8276         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700) {
    8277                 :          0 :                 u32 masked_phy_id = tp->phy_id & TG3_PHY_ID_MASK;
    8278                 :            : 
    8279         [ #  # ]:          0 :                 if (masked_phy_id == TG3_PHY_ID_BCM5401)
    8280                 :          0 :                         mac_mode &= ~MAC_MODE_LINK_POLARITY;
    8281         [ #  # ]:          0 :                 else if (masked_phy_id == TG3_PHY_ID_BCM5411)
    8282                 :          0 :                         mac_mode |= MAC_MODE_LINK_POLARITY;
    8283                 :            : 
    8284                 :          0 :                 tg3_writephy(tp, MII_TG3_EXT_CTRL,
    8285                 :            :                              MII_TG3_EXT_CTRL_LNK3_LED_MODE);
    8286                 :            :         }
    8287                 :            : 
    8288                 :          0 :         tw32(MAC_MODE, mac_mode);
    8289                 :          0 :         udelay(40);
    8290                 :            : 
    8291                 :          0 :         return 0;
    8292                 :            : }
    8293                 :            : 
    8294                 :          0 : static void tg3_set_loopback(struct net_device *dev, netdev_features_t features)
    8295                 :            : {
    8296         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
    8297                 :            : 
    8298         [ #  # ]:          0 :         if (features & NETIF_F_LOOPBACK) {
    8299         [ #  # ]:          0 :                 if (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK)
    8300                 :            :                         return;
    8301                 :            : 
    8302                 :          0 :                 spin_lock_bh(&tp->lock);
    8303                 :          0 :                 tg3_mac_loopback(tp, true);
    8304                 :          0 :                 netif_carrier_on(tp->dev);
    8305                 :          0 :                 spin_unlock_bh(&tp->lock);
    8306                 :          0 :                 netdev_info(dev, "Internal MAC loopback mode enabled.\n");
    8307                 :            :         } else {
    8308         [ #  # ]:          0 :                 if (!(tp->mac_mode & MAC_MODE_PORT_INT_LPBACK))
    8309                 :            :                         return;
    8310                 :            : 
    8311                 :          0 :                 spin_lock_bh(&tp->lock);
    8312                 :          0 :                 tg3_mac_loopback(tp, false);
    8313                 :            :                 /* Force link status check */
    8314                 :          0 :                 tg3_setup_phy(tp, true);
    8315                 :          0 :                 spin_unlock_bh(&tp->lock);
    8316                 :          0 :                 netdev_info(dev, "Internal MAC loopback mode disabled.\n");
    8317                 :            :         }
    8318                 :            : }
    8319                 :            : 
    8320                 :          0 : static netdev_features_t tg3_fix_features(struct net_device *dev,
    8321                 :            :         netdev_features_t features)
    8322                 :            : {
    8323         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
    8324                 :            : 
    8325   [ #  #  #  # ]:          0 :         if (dev->mtu > ETH_DATA_LEN && tg3_flag(tp, 5780_CLASS))
    8326                 :          0 :                 features &= ~NETIF_F_ALL_TSO;
    8327                 :            : 
    8328                 :          0 :         return features;
    8329                 :            : }
    8330                 :            : 
    8331                 :          0 : static int tg3_set_features(struct net_device *dev, netdev_features_t features)
    8332                 :            : {
    8333                 :          0 :         netdev_features_t changed = dev->features ^ features;
    8334                 :            : 
    8335   [ #  #  #  # ]:          0 :         if ((changed & NETIF_F_LOOPBACK) && netif_running(dev))
    8336                 :          0 :                 tg3_set_loopback(dev, features);
    8337                 :            : 
    8338                 :          0 :         return 0;
    8339                 :            : }
    8340                 :            : 
    8341                 :          0 : static void tg3_rx_prodring_free(struct tg3 *tp,
    8342                 :            :                                  struct tg3_rx_prodring_set *tpr)
    8343                 :            : {
    8344                 :          0 :         int i;
    8345                 :            : 
    8346         [ #  # ]:          0 :         if (tpr != &tp->napi[0].prodring) {
    8347         [ #  # ]:          0 :                 for (i = tpr->rx_std_cons_idx; i != tpr->rx_std_prod_idx;
    8348                 :          0 :                      i = (i + 1) & tp->rx_std_ring_mask)
    8349                 :          0 :                         tg3_rx_data_free(tp, &tpr->rx_std_buffers[i],
    8350                 :            :                                         tp->rx_pkt_map_sz);
    8351                 :            : 
    8352         [ #  # ]:          0 :                 if (tg3_flag(tp, JUMBO_CAPABLE)) {
    8353                 :          0 :                         for (i = tpr->rx_jmb_cons_idx;
    8354         [ #  # ]:          0 :                              i != tpr->rx_jmb_prod_idx;
    8355                 :          0 :                              i = (i + 1) & tp->rx_jmb_ring_mask) {
    8356                 :          0 :                                 tg3_rx_data_free(tp, &tpr->rx_jmb_buffers[i],
    8357                 :            :                                                 TG3_RX_JMB_MAP_SZ);
    8358                 :            :                         }
    8359                 :            :                 }
    8360                 :            : 
    8361                 :          0 :                 return;
    8362                 :            :         }
    8363                 :            : 
    8364         [ #  # ]:          0 :         for (i = 0; i <= tp->rx_std_ring_mask; i++)
    8365                 :          0 :                 tg3_rx_data_free(tp, &tpr->rx_std_buffers[i],
    8366                 :            :                                 tp->rx_pkt_map_sz);
    8367                 :            : 
    8368   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS)) {
    8369         [ #  # ]:          0 :                 for (i = 0; i <= tp->rx_jmb_ring_mask; i++)
    8370                 :          0 :                         tg3_rx_data_free(tp, &tpr->rx_jmb_buffers[i],
    8371                 :            :                                         TG3_RX_JMB_MAP_SZ);
    8372                 :            :         }
    8373                 :            : }
    8374                 :            : 
    8375                 :            : /* Initialize rx rings for packet processing.
    8376                 :            :  *
    8377                 :            :  * The chip has been shut down and the driver detached from
    8378                 :            :  * the networking, so no interrupts or new tx packets will
    8379                 :            :  * end up in the driver.  tp->{tx,}lock are held and thus
    8380                 :            :  * we may not sleep.
    8381                 :            :  */
    8382                 :          0 : static int tg3_rx_prodring_alloc(struct tg3 *tp,
    8383                 :            :                                  struct tg3_rx_prodring_set *tpr)
    8384                 :            : {
    8385                 :          0 :         u32 i, rx_pkt_dma_sz;
    8386                 :            : 
    8387                 :          0 :         tpr->rx_std_cons_idx = 0;
    8388                 :          0 :         tpr->rx_std_prod_idx = 0;
    8389                 :          0 :         tpr->rx_jmb_cons_idx = 0;
    8390                 :          0 :         tpr->rx_jmb_prod_idx = 0;
    8391                 :            : 
    8392         [ #  # ]:          0 :         if (tpr != &tp->napi[0].prodring) {
    8393         [ #  # ]:          0 :                 memset(&tpr->rx_std_buffers[0], 0,
    8394                 :          0 :                        TG3_RX_STD_BUFF_RING_SIZE(tp));
    8395         [ #  # ]:          0 :                 if (tpr->rx_jmb_buffers)
    8396         [ #  # ]:          0 :                         memset(&tpr->rx_jmb_buffers[0], 0,
    8397                 :            :                                TG3_RX_JMB_BUFF_RING_SIZE(tp));
    8398                 :          0 :                 goto done;
    8399                 :            :         }
    8400                 :            : 
    8401                 :            :         /* Zero out all descriptors. */
    8402         [ #  # ]:          0 :         memset(tpr->rx_std, 0, TG3_RX_STD_RING_BYTES(tp));
    8403                 :            : 
    8404                 :          0 :         rx_pkt_dma_sz = TG3_RX_STD_DMA_SZ;
    8405         [ #  # ]:          0 :         if (tg3_flag(tp, 5780_CLASS) &&
    8406         [ #  # ]:          0 :             tp->dev->mtu > ETH_DATA_LEN)
    8407                 :          0 :                 rx_pkt_dma_sz = TG3_RX_JMB_DMA_SZ;
    8408                 :          0 :         tp->rx_pkt_map_sz = TG3_RX_DMA_TO_MAP_SZ(rx_pkt_dma_sz);
    8409                 :            : 
    8410                 :            :         /* Initialize invariants of the rings, we only set this
    8411                 :            :          * stuff once.  This works because the card does not
    8412                 :            :          * write into the rx buffer posting rings.
    8413                 :            :          */
    8414         [ #  # ]:          0 :         for (i = 0; i <= tp->rx_std_ring_mask; i++) {
    8415                 :          0 :                 struct tg3_rx_buffer_desc *rxd;
    8416                 :            : 
    8417                 :          0 :                 rxd = &tpr->rx_std[i];
    8418                 :          0 :                 rxd->idx_len = rx_pkt_dma_sz << RXD_LEN_SHIFT;
    8419                 :          0 :                 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT);
    8420                 :          0 :                 rxd->opaque = (RXD_OPAQUE_RING_STD |
    8421                 :            :                                (i << RXD_OPAQUE_INDEX_SHIFT));
    8422                 :            :         }
    8423                 :            : 
    8424                 :            :         /* Now allocate fresh SKBs for each rx ring. */
    8425         [ #  # ]:          0 :         for (i = 0; i < tp->rx_pending; i++) {
    8426                 :          0 :                 unsigned int frag_size;
    8427                 :            : 
    8428         [ #  # ]:          0 :                 if (tg3_alloc_rx_data(tp, tpr, RXD_OPAQUE_RING_STD, i,
    8429                 :            :                                       &frag_size) < 0) {
    8430                 :          0 :                         netdev_warn(tp->dev,
    8431                 :            :                                     "Using a smaller RX standard ring. Only "
    8432                 :            :                                     "%d out of %d buffers were allocated "
    8433                 :            :                                     "successfully\n", i, tp->rx_pending);
    8434         [ #  # ]:          0 :                         if (i == 0)
    8435                 :          0 :                                 goto initfail;
    8436                 :          0 :                         tp->rx_pending = i;
    8437                 :          0 :                         break;
    8438                 :            :                 }
    8439                 :            :         }
    8440                 :            : 
    8441   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, JUMBO_CAPABLE) || tg3_flag(tp, 5780_CLASS))
    8442                 :          0 :                 goto done;
    8443                 :            : 
    8444         [ #  # ]:          0 :         memset(tpr->rx_jmb, 0, TG3_RX_JMB_RING_BYTES(tp));
    8445                 :            : 
    8446         [ #  # ]:          0 :         if (!tg3_flag(tp, JUMBO_RING_ENABLE))
    8447                 :          0 :                 goto done;
    8448                 :            : 
    8449         [ #  # ]:          0 :         for (i = 0; i <= tp->rx_jmb_ring_mask; i++) {
    8450                 :          0 :                 struct tg3_rx_buffer_desc *rxd;
    8451                 :            : 
    8452                 :          0 :                 rxd = &tpr->rx_jmb[i].std;
    8453                 :          0 :                 rxd->idx_len = TG3_RX_JMB_DMA_SZ << RXD_LEN_SHIFT;
    8454                 :          0 :                 rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT) |
    8455                 :            :                                   RXD_FLAG_JUMBO;
    8456                 :          0 :                 rxd->opaque = (RXD_OPAQUE_RING_JUMBO |
    8457                 :            :                        (i << RXD_OPAQUE_INDEX_SHIFT));
    8458                 :            :         }
    8459                 :            : 
    8460         [ #  # ]:          0 :         for (i = 0; i < tp->rx_jumbo_pending; i++) {
    8461                 :          0 :                 unsigned int frag_size;
    8462                 :            : 
    8463         [ #  # ]:          0 :                 if (tg3_alloc_rx_data(tp, tpr, RXD_OPAQUE_RING_JUMBO, i,
    8464                 :            :                                       &frag_size) < 0) {
    8465                 :          0 :                         netdev_warn(tp->dev,
    8466                 :            :                                     "Using a smaller RX jumbo ring. Only %d "
    8467                 :            :                                     "out of %d buffers were allocated "
    8468                 :            :                                     "successfully\n", i, tp->rx_jumbo_pending);
    8469         [ #  # ]:          0 :                         if (i == 0)
    8470                 :          0 :                                 goto initfail;
    8471                 :          0 :                         tp->rx_jumbo_pending = i;
    8472                 :          0 :                         break;
    8473                 :            :                 }
    8474                 :            :         }
    8475                 :            : 
    8476                 :          0 : done:
    8477                 :            :         return 0;
    8478                 :            : 
    8479                 :          0 : initfail:
    8480                 :          0 :         tg3_rx_prodring_free(tp, tpr);
    8481                 :          0 :         return -ENOMEM;
    8482                 :            : }
    8483                 :            : 
    8484                 :          0 : static void tg3_rx_prodring_fini(struct tg3 *tp,
    8485                 :            :                                  struct tg3_rx_prodring_set *tpr)
    8486                 :            : {
    8487                 :          0 :         kfree(tpr->rx_std_buffers);
    8488                 :          0 :         tpr->rx_std_buffers = NULL;
    8489                 :          0 :         kfree(tpr->rx_jmb_buffers);
    8490                 :          0 :         tpr->rx_jmb_buffers = NULL;
    8491         [ #  # ]:          0 :         if (tpr->rx_std) {
    8492         [ #  # ]:          0 :                 dma_free_coherent(&tp->pdev->dev, TG3_RX_STD_RING_BYTES(tp),
    8493                 :            :                                   tpr->rx_std, tpr->rx_std_mapping);
    8494                 :          0 :                 tpr->rx_std = NULL;
    8495                 :            :         }
    8496         [ #  # ]:          0 :         if (tpr->rx_jmb) {
    8497         [ #  # ]:          0 :                 dma_free_coherent(&tp->pdev->dev, TG3_RX_JMB_RING_BYTES(tp),
    8498                 :            :                                   tpr->rx_jmb, tpr->rx_jmb_mapping);
    8499                 :          0 :                 tpr->rx_jmb = NULL;
    8500                 :            :         }
    8501                 :          0 : }
    8502                 :            : 
    8503                 :          0 : static int tg3_rx_prodring_init(struct tg3 *tp,
    8504                 :            :                                 struct tg3_rx_prodring_set *tpr)
    8505                 :            : {
    8506         [ #  # ]:          0 :         tpr->rx_std_buffers = kzalloc(TG3_RX_STD_BUFF_RING_SIZE(tp),
    8507                 :            :                                       GFP_KERNEL);
    8508         [ #  # ]:          0 :         if (!tpr->rx_std_buffers)
    8509                 :            :                 return -ENOMEM;
    8510                 :            : 
    8511         [ #  # ]:          0 :         tpr->rx_std = dma_alloc_coherent(&tp->pdev->dev,
    8512                 :            :                                          TG3_RX_STD_RING_BYTES(tp),
    8513                 :            :                                          &tpr->rx_std_mapping,
    8514                 :            :                                          GFP_KERNEL);
    8515         [ #  # ]:          0 :         if (!tpr->rx_std)
    8516                 :          0 :                 goto err_out;
    8517                 :            : 
    8518   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS)) {
    8519         [ #  # ]:          0 :                 tpr->rx_jmb_buffers = kzalloc(TG3_RX_JMB_BUFF_RING_SIZE(tp),
    8520                 :            :                                               GFP_KERNEL);
    8521         [ #  # ]:          0 :                 if (!tpr->rx_jmb_buffers)
    8522                 :          0 :                         goto err_out;
    8523                 :            : 
    8524         [ #  # ]:          0 :                 tpr->rx_jmb = dma_alloc_coherent(&tp->pdev->dev,
    8525                 :            :                                                  TG3_RX_JMB_RING_BYTES(tp),
    8526                 :            :                                                  &tpr->rx_jmb_mapping,
    8527                 :            :                                                  GFP_KERNEL);
    8528         [ #  # ]:          0 :                 if (!tpr->rx_jmb)
    8529                 :          0 :                         goto err_out;
    8530                 :            :         }
    8531                 :            : 
    8532                 :            :         return 0;
    8533                 :            : 
    8534                 :          0 : err_out:
    8535                 :          0 :         tg3_rx_prodring_fini(tp, tpr);
    8536                 :          0 :         return -ENOMEM;
    8537                 :            : }
    8538                 :            : 
    8539                 :            : /* Free up pending packets in all rx/tx rings.
    8540                 :            :  *
    8541                 :            :  * The chip has been shut down and the driver detached from
    8542                 :            :  * the networking, so no interrupts or new tx packets will
    8543                 :            :  * end up in the driver.  tp->{tx,}lock is not held and we are not
    8544                 :            :  * in an interrupt context and thus may sleep.
    8545                 :            :  */
    8546                 :          0 : static void tg3_free_rings(struct tg3 *tp)
    8547                 :            : {
    8548                 :          0 :         int i, j;
    8549                 :            : 
    8550         [ #  # ]:          0 :         for (j = 0; j < tp->irq_cnt; j++) {
    8551                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[j];
    8552                 :            : 
    8553                 :          0 :                 tg3_rx_prodring_free(tp, &tnapi->prodring);
    8554                 :            : 
    8555         [ #  # ]:          0 :                 if (!tnapi->tx_buffers)
    8556                 :          0 :                         continue;
    8557                 :            : 
    8558         [ #  # ]:          0 :                 for (i = 0; i < TG3_TX_RING_SIZE; i++) {
    8559                 :          0 :                         struct sk_buff *skb = tnapi->tx_buffers[i].skb;
    8560                 :            : 
    8561         [ #  # ]:          0 :                         if (!skb)
    8562                 :          0 :                                 continue;
    8563                 :            : 
    8564                 :          0 :                         tg3_tx_skb_unmap(tnapi, i,
    8565                 :          0 :                                          skb_shinfo(skb)->nr_frags - 1);
    8566                 :            : 
    8567                 :          0 :                         dev_consume_skb_any(skb);
    8568                 :            :                 }
    8569                 :          0 :                 netdev_tx_reset_queue(netdev_get_tx_queue(tp->dev, j));
    8570                 :            :         }
    8571                 :          0 : }
    8572                 :            : 
    8573                 :            : /* Initialize tx/rx rings for packet processing.
    8574                 :            :  *
    8575                 :            :  * The chip has been shut down and the driver detached from
    8576                 :            :  * the networking, so no interrupts or new tx packets will
    8577                 :            :  * end up in the driver.  tp->{tx,}lock are held and thus
    8578                 :            :  * we may not sleep.
    8579                 :            :  */
    8580                 :          0 : static int tg3_init_rings(struct tg3 *tp)
    8581                 :            : {
    8582                 :          0 :         int i;
    8583                 :            : 
    8584                 :            :         /* Free up all the SKBs. */
    8585                 :          0 :         tg3_free_rings(tp);
    8586                 :            : 
    8587         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    8588                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8589                 :            : 
    8590                 :          0 :                 tnapi->last_tag = 0;
    8591                 :          0 :                 tnapi->last_irq_tag = 0;
    8592                 :          0 :                 tnapi->hw_status->status = 0;
    8593                 :          0 :                 tnapi->hw_status->status_tag = 0;
    8594                 :          0 :                 memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE);
    8595                 :            : 
    8596                 :          0 :                 tnapi->tx_prod = 0;
    8597                 :          0 :                 tnapi->tx_cons = 0;
    8598         [ #  # ]:          0 :                 if (tnapi->tx_ring)
    8599                 :          0 :                         memset(tnapi->tx_ring, 0, TG3_TX_RING_BYTES);
    8600                 :            : 
    8601                 :          0 :                 tnapi->rx_rcb_ptr = 0;
    8602         [ #  # ]:          0 :                 if (tnapi->rx_rcb)
    8603                 :          0 :                         memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
    8604                 :            : 
    8605   [ #  #  #  # ]:          0 :                 if (tnapi->prodring.rx_std &&
    8606                 :          0 :                     tg3_rx_prodring_alloc(tp, &tnapi->prodring)) {
    8607                 :          0 :                         tg3_free_rings(tp);
    8608                 :          0 :                         return -ENOMEM;
    8609                 :            :                 }
    8610                 :            :         }
    8611                 :            : 
    8612                 :            :         return 0;
    8613                 :            : }
    8614                 :            : 
    8615                 :          0 : static void tg3_mem_tx_release(struct tg3 *tp)
    8616                 :            : {
    8617                 :          0 :         int i;
    8618                 :            : 
    8619         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++) {
    8620                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8621                 :            : 
    8622         [ #  # ]:          0 :                 if (tnapi->tx_ring) {
    8623                 :          0 :                         dma_free_coherent(&tp->pdev->dev, TG3_TX_RING_BYTES,
    8624                 :            :                                 tnapi->tx_ring, tnapi->tx_desc_mapping);
    8625                 :          0 :                         tnapi->tx_ring = NULL;
    8626                 :            :                 }
    8627                 :            : 
    8628                 :          0 :                 kfree(tnapi->tx_buffers);
    8629                 :          0 :                 tnapi->tx_buffers = NULL;
    8630                 :            :         }
    8631                 :          0 : }
    8632                 :            : 
    8633                 :          0 : static int tg3_mem_tx_acquire(struct tg3 *tp)
    8634                 :            : {
    8635                 :          0 :         int i;
    8636                 :          0 :         struct tg3_napi *tnapi = &tp->napi[0];
    8637                 :            : 
    8638                 :            :         /* If multivector TSS is enabled, vector 0 does not handle
    8639                 :            :          * tx interrupts.  Don't allocate any resources for it.
    8640                 :            :          */
    8641         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_TSS))
    8642                 :          0 :                 tnapi++;
    8643                 :            : 
    8644         [ #  # ]:          0 :         for (i = 0; i < tp->txq_cnt; i++, tnapi++) {
    8645                 :          0 :                 tnapi->tx_buffers = kcalloc(TG3_TX_RING_SIZE,
    8646                 :            :                                             sizeof(struct tg3_tx_ring_info),
    8647                 :            :                                             GFP_KERNEL);
    8648         [ #  # ]:          0 :                 if (!tnapi->tx_buffers)
    8649                 :          0 :                         goto err_out;
    8650                 :            : 
    8651                 :          0 :                 tnapi->tx_ring = dma_alloc_coherent(&tp->pdev->dev,
    8652                 :            :                                                     TG3_TX_RING_BYTES,
    8653                 :            :                                                     &tnapi->tx_desc_mapping,
    8654                 :            :                                                     GFP_KERNEL);
    8655         [ #  # ]:          0 :                 if (!tnapi->tx_ring)
    8656                 :          0 :                         goto err_out;
    8657                 :            :         }
    8658                 :            : 
    8659                 :            :         return 0;
    8660                 :            : 
    8661                 :          0 : err_out:
    8662                 :          0 :         tg3_mem_tx_release(tp);
    8663                 :          0 :         return -ENOMEM;
    8664                 :            : }
    8665                 :            : 
    8666                 :          0 : static void tg3_mem_rx_release(struct tg3 *tp)
    8667                 :            : {
    8668                 :          0 :         int i;
    8669                 :            : 
    8670         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++) {
    8671                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8672                 :            : 
    8673                 :          0 :                 tg3_rx_prodring_fini(tp, &tnapi->prodring);
    8674                 :            : 
    8675         [ #  # ]:          0 :                 if (!tnapi->rx_rcb)
    8676                 :          0 :                         continue;
    8677                 :            : 
    8678                 :          0 :                 dma_free_coherent(&tp->pdev->dev,
    8679                 :          0 :                                   TG3_RX_RCB_RING_BYTES(tp),
    8680                 :            :                                   tnapi->rx_rcb,
    8681                 :            :                                   tnapi->rx_rcb_mapping);
    8682                 :          0 :                 tnapi->rx_rcb = NULL;
    8683                 :            :         }
    8684                 :          0 : }
    8685                 :            : 
    8686                 :          0 : static int tg3_mem_rx_acquire(struct tg3 *tp)
    8687                 :            : {
    8688                 :          0 :         unsigned int i, limit;
    8689                 :            : 
    8690                 :          0 :         limit = tp->rxq_cnt;
    8691                 :            : 
    8692                 :            :         /* If RSS is enabled, we need a (dummy) producer ring
    8693                 :            :          * set on vector zero.  This is the true hw prodring.
    8694                 :            :          */
    8695         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_RSS))
    8696                 :          0 :                 limit++;
    8697                 :            : 
    8698         [ #  # ]:          0 :         for (i = 0; i < limit; i++) {
    8699                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8700                 :            : 
    8701         [ #  # ]:          0 :                 if (tg3_rx_prodring_init(tp, &tnapi->prodring))
    8702                 :          0 :                         goto err_out;
    8703                 :            : 
    8704                 :            :                 /* If multivector RSS is enabled, vector 0
    8705                 :            :                  * does not handle rx or tx interrupts.
    8706                 :            :                  * Don't allocate any resources for it.
    8707                 :            :                  */
    8708   [ #  #  #  # ]:          0 :                 if (!i && tg3_flag(tp, ENABLE_RSS))
    8709                 :          0 :                         continue;
    8710                 :            : 
    8711                 :          0 :                 tnapi->rx_rcb = dma_alloc_coherent(&tp->pdev->dev,
    8712                 :          0 :                                                    TG3_RX_RCB_RING_BYTES(tp),
    8713                 :            :                                                    &tnapi->rx_rcb_mapping,
    8714                 :            :                                                    GFP_KERNEL);
    8715         [ #  # ]:          0 :                 if (!tnapi->rx_rcb)
    8716                 :          0 :                         goto err_out;
    8717                 :            :         }
    8718                 :            : 
    8719                 :            :         return 0;
    8720                 :            : 
    8721                 :          0 : err_out:
    8722                 :          0 :         tg3_mem_rx_release(tp);
    8723                 :          0 :         return -ENOMEM;
    8724                 :            : }
    8725                 :            : 
    8726                 :            : /*
    8727                 :            :  * Must not be invoked with interrupt sources disabled and
    8728                 :            :  * the hardware shutdown down.
    8729                 :            :  */
    8730                 :          0 : static void tg3_free_consistent(struct tg3 *tp)
    8731                 :            : {
    8732                 :          0 :         int i;
    8733                 :            : 
    8734         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    8735                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8736                 :            : 
    8737         [ #  # ]:          0 :                 if (tnapi->hw_status) {
    8738                 :          0 :                         dma_free_coherent(&tp->pdev->dev, TG3_HW_STATUS_SIZE,
    8739                 :            :                                           tnapi->hw_status,
    8740                 :            :                                           tnapi->status_mapping);
    8741                 :          0 :                         tnapi->hw_status = NULL;
    8742                 :            :                 }
    8743                 :            :         }
    8744                 :            : 
    8745                 :          0 :         tg3_mem_rx_release(tp);
    8746                 :          0 :         tg3_mem_tx_release(tp);
    8747                 :            : 
    8748                 :            :         /* tp->hw_stats can be referenced safely:
    8749                 :            :          *     1. under rtnl_lock
    8750                 :            :          *     2. or under tp->lock if TG3_FLAG_INIT_COMPLETE is set.
    8751                 :            :          */
    8752         [ #  # ]:          0 :         if (tp->hw_stats) {
    8753                 :          0 :                 dma_free_coherent(&tp->pdev->dev, sizeof(struct tg3_hw_stats),
    8754                 :            :                                   tp->hw_stats, tp->stats_mapping);
    8755                 :          0 :                 tp->hw_stats = NULL;
    8756                 :            :         }
    8757                 :          0 : }
    8758                 :            : 
    8759                 :            : /*
    8760                 :            :  * Must not be invoked with interrupt sources disabled and
    8761                 :            :  * the hardware shutdown down.  Can sleep.
    8762                 :            :  */
    8763                 :          0 : static int tg3_alloc_consistent(struct tg3 *tp)
    8764                 :            : {
    8765                 :          0 :         int i;
    8766                 :            : 
    8767                 :          0 :         tp->hw_stats = dma_alloc_coherent(&tp->pdev->dev,
    8768                 :            :                                           sizeof(struct tg3_hw_stats),
    8769                 :            :                                           &tp->stats_mapping, GFP_KERNEL);
    8770         [ #  # ]:          0 :         if (!tp->hw_stats)
    8771                 :          0 :                 goto err_out;
    8772                 :            : 
    8773         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    8774                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8775                 :          0 :                 struct tg3_hw_status *sblk;
    8776                 :            : 
    8777                 :          0 :                 tnapi->hw_status = dma_alloc_coherent(&tp->pdev->dev,
    8778                 :            :                                                       TG3_HW_STATUS_SIZE,
    8779                 :            :                                                       &tnapi->status_mapping,
    8780                 :            :                                                       GFP_KERNEL);
    8781         [ #  # ]:          0 :                 if (!tnapi->hw_status)
    8782                 :          0 :                         goto err_out;
    8783                 :            : 
    8784                 :          0 :                 sblk = tnapi->hw_status;
    8785                 :            : 
    8786         [ #  # ]:          0 :                 if (tg3_flag(tp, ENABLE_RSS)) {
    8787                 :          0 :                         u16 *prodptr = NULL;
    8788                 :            : 
    8789                 :            :                         /*
    8790                 :            :                          * When RSS is enabled, the status block format changes
    8791                 :            :                          * slightly.  The "rx_jumbo_consumer", "reserved",
    8792                 :            :                          * and "rx_mini_consumer" members get mapped to the
    8793                 :            :                          * other three rx return ring producer indexes.
    8794                 :            :                          */
    8795   [ #  #  #  #  :          0 :                         switch (i) {
                      # ]
    8796                 :          0 :                         case 1:
    8797                 :          0 :                                 prodptr = &sblk->idx[0].rx_producer;
    8798                 :          0 :                                 break;
    8799                 :          0 :                         case 2:
    8800                 :          0 :                                 prodptr = &sblk->rx_jumbo_consumer;
    8801                 :          0 :                                 break;
    8802                 :          0 :                         case 3:
    8803                 :          0 :                                 prodptr = &sblk->reserved;
    8804                 :          0 :                                 break;
    8805                 :          0 :                         case 4:
    8806                 :          0 :                                 prodptr = &sblk->rx_mini_consumer;
    8807                 :          0 :                                 break;
    8808                 :            :                         }
    8809                 :          0 :                         tnapi->rx_rcb_prod_idx = prodptr;
    8810                 :            :                 } else {
    8811                 :          0 :                         tnapi->rx_rcb_prod_idx = &sblk->idx[0].rx_producer;
    8812                 :            :                 }
    8813                 :            :         }
    8814                 :            : 
    8815   [ #  #  #  # ]:          0 :         if (tg3_mem_tx_acquire(tp) || tg3_mem_rx_acquire(tp))
    8816                 :          0 :                 goto err_out;
    8817                 :            : 
    8818                 :            :         return 0;
    8819                 :            : 
    8820                 :          0 : err_out:
    8821                 :          0 :         tg3_free_consistent(tp);
    8822                 :          0 :         return -ENOMEM;
    8823                 :            : }
    8824                 :            : 
    8825                 :            : #define MAX_WAIT_CNT 1000
    8826                 :            : 
    8827                 :            : /* To stop a block, clear the enable bit and poll till it
    8828                 :            :  * clears.  tp->lock is held.
    8829                 :            :  */
    8830                 :          0 : static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit, bool silent)
    8831                 :            : {
    8832                 :          0 :         unsigned int i;
    8833                 :          0 :         u32 val;
    8834                 :            : 
    8835         [ #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS)) {
    8836         [ #  # ]:          0 :                 switch (ofs) {
    8837                 :            :                 case RCVLSC_MODE:
    8838                 :            :                 case DMAC_MODE:
    8839                 :            :                 case MBFREE_MODE:
    8840                 :            :                 case BUFMGR_MODE:
    8841                 :            :                 case MEMARB_MODE:
    8842                 :            :                         /* We can't enable/disable these bits of the
    8843                 :            :                          * 5705/5750, just say success.
    8844                 :            :                          */
    8845                 :            :                         return 0;
    8846                 :            : 
    8847                 :            :                 default:
    8848                 :            :                         break;
    8849                 :            :                 }
    8850                 :          0 :         }
    8851                 :            : 
    8852                 :          0 :         val = tr32(ofs);
    8853                 :          0 :         val &= ~enable_bit;
    8854                 :          0 :         tw32_f(ofs, val);
    8855                 :            : 
    8856         [ #  # ]:          0 :         for (i = 0; i < MAX_WAIT_CNT; i++) {
    8857         [ #  # ]:          0 :                 if (pci_channel_offline(tp->pdev)) {
    8858                 :          0 :                         dev_err(&tp->pdev->dev,
    8859                 :            :                                 "tg3_stop_block device offline, "
    8860                 :            :                                 "ofs=%lx enable_bit=%x\n",
    8861                 :            :                                 ofs, enable_bit);
    8862                 :          0 :                         return -ENODEV;
    8863                 :            :                 }
    8864                 :            : 
    8865                 :          0 :                 udelay(100);
    8866                 :          0 :                 val = tr32(ofs);
    8867         [ #  # ]:          0 :                 if ((val & enable_bit) == 0)
    8868                 :            :                         break;
    8869                 :            :         }
    8870                 :            : 
    8871         [ #  # ]:          0 :         if (i == MAX_WAIT_CNT && !silent) {
    8872                 :          0 :                 dev_err(&tp->pdev->dev,
    8873                 :            :                         "tg3_stop_block timed out, ofs=%lx enable_bit=%x\n",
    8874                 :            :                         ofs, enable_bit);
    8875                 :          0 :                 return -ENODEV;
    8876                 :            :         }
    8877                 :            : 
    8878                 :            :         return 0;
    8879                 :            : }
    8880                 :            : 
    8881                 :            : /* tp->lock is held. */
    8882                 :          0 : static int tg3_abort_hw(struct tg3 *tp, bool silent)
    8883                 :            : {
    8884                 :          0 :         int i, err;
    8885                 :            : 
    8886                 :          0 :         tg3_disable_ints(tp);
    8887                 :            : 
    8888         [ #  # ]:          0 :         if (pci_channel_offline(tp->pdev)) {
    8889                 :          0 :                 tp->rx_mode &= ~(RX_MODE_ENABLE | TX_MODE_ENABLE);
    8890                 :          0 :                 tp->mac_mode &= ~MAC_MODE_TDE_ENABLE;
    8891                 :          0 :                 err = -ENODEV;
    8892                 :          0 :                 goto err_no_dev;
    8893                 :            :         }
    8894                 :            : 
    8895                 :          0 :         tp->rx_mode &= ~RX_MODE_ENABLE;
    8896                 :          0 :         tw32_f(MAC_RX_MODE, tp->rx_mode);
    8897                 :          0 :         udelay(10);
    8898                 :            : 
    8899                 :          0 :         err  = tg3_stop_block(tp, RCVBDI_MODE, RCVBDI_MODE_ENABLE, silent);
    8900                 :          0 :         err |= tg3_stop_block(tp, RCVLPC_MODE, RCVLPC_MODE_ENABLE, silent);
    8901                 :          0 :         err |= tg3_stop_block(tp, RCVLSC_MODE, RCVLSC_MODE_ENABLE, silent);
    8902                 :          0 :         err |= tg3_stop_block(tp, RCVDBDI_MODE, RCVDBDI_MODE_ENABLE, silent);
    8903                 :          0 :         err |= tg3_stop_block(tp, RCVDCC_MODE, RCVDCC_MODE_ENABLE, silent);
    8904                 :          0 :         err |= tg3_stop_block(tp, RCVCC_MODE, RCVCC_MODE_ENABLE, silent);
    8905                 :            : 
    8906                 :          0 :         err |= tg3_stop_block(tp, SNDBDS_MODE, SNDBDS_MODE_ENABLE, silent);
    8907                 :          0 :         err |= tg3_stop_block(tp, SNDBDI_MODE, SNDBDI_MODE_ENABLE, silent);
    8908                 :          0 :         err |= tg3_stop_block(tp, SNDDATAI_MODE, SNDDATAI_MODE_ENABLE, silent);
    8909                 :          0 :         err |= tg3_stop_block(tp, RDMAC_MODE, RDMAC_MODE_ENABLE, silent);
    8910                 :          0 :         err |= tg3_stop_block(tp, SNDDATAC_MODE, SNDDATAC_MODE_ENABLE, silent);
    8911                 :          0 :         err |= tg3_stop_block(tp, DMAC_MODE, DMAC_MODE_ENABLE, silent);
    8912                 :          0 :         err |= tg3_stop_block(tp, SNDBDC_MODE, SNDBDC_MODE_ENABLE, silent);
    8913                 :            : 
    8914                 :          0 :         tp->mac_mode &= ~MAC_MODE_TDE_ENABLE;
    8915                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode);
    8916                 :          0 :         udelay(40);
    8917                 :            : 
    8918                 :          0 :         tp->tx_mode &= ~TX_MODE_ENABLE;
    8919                 :          0 :         tw32_f(MAC_TX_MODE, tp->tx_mode);
    8920                 :            : 
    8921         [ #  # ]:          0 :         for (i = 0; i < MAX_WAIT_CNT; i++) {
    8922                 :          0 :                 udelay(100);
    8923         [ #  # ]:          0 :                 if (!(tr32(MAC_TX_MODE) & TX_MODE_ENABLE))
    8924                 :            :                         break;
    8925                 :            :         }
    8926         [ #  # ]:          0 :         if (i >= MAX_WAIT_CNT) {
    8927                 :          0 :                 dev_err(&tp->pdev->dev,
    8928                 :            :                         "%s timed out, TX_MODE_ENABLE will not clear "
    8929                 :            :                         "MAC_TX_MODE=%08x\n", __func__, tr32(MAC_TX_MODE));
    8930                 :          0 :                 err |= -ENODEV;
    8931                 :            :         }
    8932                 :            : 
    8933                 :          0 :         err |= tg3_stop_block(tp, HOSTCC_MODE, HOSTCC_MODE_ENABLE, silent);
    8934                 :          0 :         err |= tg3_stop_block(tp, WDMAC_MODE, WDMAC_MODE_ENABLE, silent);
    8935                 :          0 :         err |= tg3_stop_block(tp, MBFREE_MODE, MBFREE_MODE_ENABLE, silent);
    8936                 :            : 
    8937                 :          0 :         tw32(FTQ_RESET, 0xffffffff);
    8938                 :          0 :         tw32(FTQ_RESET, 0x00000000);
    8939                 :            : 
    8940                 :          0 :         err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE, silent);
    8941                 :          0 :         err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE, silent);
    8942                 :            : 
    8943                 :          0 : err_no_dev:
    8944         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    8945                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    8946         [ #  # ]:          0 :                 if (tnapi->hw_status)
    8947                 :          0 :                         memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE);
    8948                 :            :         }
    8949                 :            : 
    8950                 :          0 :         return err;
    8951                 :            : }
    8952                 :            : 
    8953                 :            : /* Save PCI command register before chip reset */
    8954                 :          0 : static void tg3_save_pci_state(struct tg3 *tp)
    8955                 :            : {
    8956                 :          0 :         pci_read_config_word(tp->pdev, PCI_COMMAND, &tp->pci_cmd);
    8957                 :            : }
    8958                 :            : 
    8959                 :            : /* Restore PCI state after chip reset */
    8960                 :          0 : static void tg3_restore_pci_state(struct tg3 *tp)
    8961                 :            : {
    8962                 :          0 :         u32 val;
    8963                 :            : 
    8964                 :            :         /* Re-enable indirect register accesses. */
    8965                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
    8966                 :            :                                tp->misc_host_ctrl);
    8967                 :            : 
    8968                 :            :         /* Set MAX PCI retry to zero. */
    8969                 :          0 :         val = (PCISTATE_ROM_ENABLE | PCISTATE_ROM_RETRY_ENABLE);
    8970   [ #  #  #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0 &&
    8971                 :          0 :             tg3_flag(tp, PCIX_MODE))
    8972                 :          0 :                 val |= PCISTATE_RETRY_SAME_DMA;
    8973                 :            :         /* Allow reads and writes to the APE register and memory space. */
    8974         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE))
    8975                 :          0 :                 val |= PCISTATE_ALLOW_APE_CTLSPC_WR |
    8976                 :            :                        PCISTATE_ALLOW_APE_SHMEM_WR |
    8977                 :            :                        PCISTATE_ALLOW_APE_PSPACE_WR;
    8978                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, val);
    8979                 :            : 
    8980                 :          0 :         pci_write_config_word(tp->pdev, PCI_COMMAND, tp->pci_cmd);
    8981                 :            : 
    8982         [ #  # ]:          0 :         if (!tg3_flag(tp, PCI_EXPRESS)) {
    8983                 :          0 :                 pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE,
    8984                 :          0 :                                       tp->pci_cacheline_sz);
    8985                 :          0 :                 pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER,
    8986                 :          0 :                                       tp->pci_lat_timer);
    8987                 :            :         }
    8988                 :            : 
    8989                 :            :         /* Make sure PCI-X relaxed ordering bit is clear. */
    8990         [ #  # ]:          0 :         if (tg3_flag(tp, PCIX_MODE)) {
    8991                 :          0 :                 u16 pcix_cmd;
    8992                 :            : 
    8993                 :          0 :                 pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
    8994                 :            :                                      &pcix_cmd);
    8995                 :          0 :                 pcix_cmd &= ~PCI_X_CMD_ERO;
    8996                 :          0 :                 pci_write_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
    8997                 :            :                                       pcix_cmd);
    8998                 :            :         }
    8999                 :            : 
    9000         [ #  # ]:          0 :         if (tg3_flag(tp, 5780_CLASS)) {
    9001                 :            : 
    9002                 :            :                 /* Chip reset on 5780 will reset MSI enable bit,
    9003                 :            :                  * so need to restore it.
    9004                 :            :                  */
    9005         [ #  # ]:          0 :                 if (tg3_flag(tp, USING_MSI)) {
    9006                 :          0 :                         u16 ctrl;
    9007                 :            : 
    9008                 :          0 :                         pci_read_config_word(tp->pdev,
    9009                 :          0 :                                              tp->msi_cap + PCI_MSI_FLAGS,
    9010                 :            :                                              &ctrl);
    9011                 :          0 :                         pci_write_config_word(tp->pdev,
    9012                 :          0 :                                               tp->msi_cap + PCI_MSI_FLAGS,
    9013                 :            :                                               ctrl | PCI_MSI_FLAGS_ENABLE);
    9014                 :          0 :                         val = tr32(MSGINT_MODE);
    9015                 :          0 :                         tw32(MSGINT_MODE, val | MSGINT_MODE_ENABLE);
    9016                 :            :                 }
    9017                 :            :         }
    9018                 :          0 : }
    9019                 :            : 
    9020                 :          0 : static void tg3_override_clk(struct tg3 *tp)
    9021                 :            : {
    9022                 :          0 :         u32 val;
    9023                 :            : 
    9024      [ #  #  # ]:          0 :         switch (tg3_asic_rev(tp)) {
    9025                 :          0 :         case ASIC_REV_5717:
    9026                 :          0 :                 val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE);
    9027                 :          0 :                 tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val |
    9028                 :            :                      TG3_CPMU_MAC_ORIDE_ENABLE);
    9029                 :          0 :                 break;
    9030                 :            : 
    9031                 :          0 :         case ASIC_REV_5719:
    9032                 :            :         case ASIC_REV_5720:
    9033                 :          0 :                 tw32(TG3_CPMU_CLCK_ORIDE, CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
    9034                 :          0 :                 break;
    9035                 :            : 
    9036                 :            :         default:
    9037                 :            :                 return;
    9038                 :            :         }
    9039                 :            : }
    9040                 :            : 
    9041                 :          0 : static void tg3_restore_clk(struct tg3 *tp)
    9042                 :            : {
    9043                 :          0 :         u32 val;
    9044                 :            : 
    9045      [ #  #  # ]:          0 :         switch (tg3_asic_rev(tp)) {
    9046                 :          0 :         case ASIC_REV_5717:
    9047                 :          0 :                 val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE);
    9048                 :          0 :                 tw32(TG3_CPMU_CLCK_ORIDE_ENABLE,
    9049                 :            :                      val & ~TG3_CPMU_MAC_ORIDE_ENABLE);
    9050                 :          0 :                 break;
    9051                 :            : 
    9052                 :          0 :         case ASIC_REV_5719:
    9053                 :            :         case ASIC_REV_5720:
    9054                 :          0 :                 val = tr32(TG3_CPMU_CLCK_ORIDE);
    9055                 :          0 :                 tw32(TG3_CPMU_CLCK_ORIDE, val & ~CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
    9056                 :          0 :                 break;
    9057                 :            : 
    9058                 :            :         default:
    9059                 :            :                 return;
    9060                 :            :         }
    9061                 :            : }
    9062                 :            : 
    9063                 :            : /* tp->lock is held. */
    9064                 :          0 : static int tg3_chip_reset(struct tg3 *tp)
    9065                 :            :         __releases(tp->lock)
    9066                 :            :         __acquires(tp->lock)
    9067                 :            : {
    9068                 :          0 :         u32 val;
    9069                 :          0 :         void (*write_op)(struct tg3 *, u32, u32);
    9070                 :          0 :         int i, err;
    9071                 :            : 
    9072         [ #  # ]:          0 :         if (!pci_device_is_present(tp->pdev))
    9073                 :            :                 return -ENODEV;
    9074                 :            : 
    9075                 :          0 :         tg3_nvram_lock(tp);
    9076                 :            : 
    9077                 :          0 :         tg3_ape_lock(tp, TG3_APE_LOCK_GRC);
    9078                 :            : 
    9079                 :            :         /* No matching tg3_nvram_unlock() after this because
    9080                 :            :          * chip reset below will undo the nvram lock.
    9081                 :            :          */
    9082                 :          0 :         tp->nvram_lock_cnt = 0;
    9083                 :            : 
    9084                 :            :         /* GRC_MISC_CFG core clock reset will clear the memory
    9085                 :            :          * enable bit in PCI register 4 and the MSI enable bit
    9086                 :            :          * on some chips, so we save relevant registers here.
    9087                 :            :          */
    9088                 :          0 :         tg3_save_pci_state(tp);
    9089                 :            : 
    9090   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5752 ||
    9091                 :          0 :             tg3_flag(tp, 5755_PLUS))
    9092                 :          0 :                 tw32(GRC_FASTBOOT_PC, 0);
    9093                 :            : 
    9094                 :            :         /*
    9095                 :            :          * We must avoid the readl() that normally takes place.
    9096                 :            :          * It locks machines, causes machine checks, and other
    9097                 :            :          * fun things.  So, temporarily disable the 5701
    9098                 :            :          * hardware workaround, while we do the reset.
    9099                 :            :          */
    9100                 :          0 :         write_op = tp->write32;
    9101         [ #  # ]:          0 :         if (write_op == tg3_write_flush_reg32)
    9102                 :          0 :                 tp->write32 = tg3_write32;
    9103                 :            : 
    9104                 :            :         /* Prevent the irq handler from reading or writing PCI registers
    9105                 :            :          * during chip reset when the memory enable bit in the PCI command
    9106                 :            :          * register may be cleared.  The chip does not generate interrupt
    9107                 :            :          * at this time, but the irq handler may still be called due to irq
    9108                 :            :          * sharing or irqpoll.
    9109                 :            :          */
    9110                 :          0 :         tg3_flag_set(tp, CHIP_RESETTING);
    9111         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
    9112                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    9113         [ #  # ]:          0 :                 if (tnapi->hw_status) {
    9114                 :          0 :                         tnapi->hw_status->status = 0;
    9115                 :          0 :                         tnapi->hw_status->status_tag = 0;
    9116                 :            :                 }
    9117                 :          0 :                 tnapi->last_tag = 0;
    9118                 :          0 :                 tnapi->last_irq_tag = 0;
    9119                 :            :         }
    9120                 :          0 :         smp_mb();
    9121                 :            : 
    9122                 :          0 :         tg3_full_unlock(tp);
    9123                 :            : 
    9124         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++)
    9125                 :          0 :                 synchronize_irq(tp->napi[i].irq_vec);
    9126                 :            : 
    9127                 :          0 :         tg3_full_lock(tp, 0);
    9128                 :            : 
    9129         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57780) {
    9130                 :          0 :                 val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN;
    9131                 :          0 :                 tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS);
    9132                 :            :         }
    9133                 :            : 
    9134                 :            :         /* do the reset */
    9135                 :          0 :         val = GRC_MISC_CFG_CORECLK_RESET;
    9136                 :            : 
    9137         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS)) {
    9138                 :            :                 /* Force PCIe 1.0a mode */
    9139   [ #  #  #  # ]:          0 :                 if (tg3_asic_rev(tp) != ASIC_REV_5785 &&
    9140         [ #  # ]:          0 :                     !tg3_flag(tp, 57765_PLUS) &&
    9141                 :          0 :                     tr32(TG3_PCIE_PHY_TSTCTL) ==
    9142                 :            :                     (TG3_PCIE_PHY_TSTCTL_PCIE10 | TG3_PCIE_PHY_TSTCTL_PSCRAM))
    9143                 :          0 :                         tw32(TG3_PCIE_PHY_TSTCTL, TG3_PCIE_PHY_TSTCTL_PSCRAM);
    9144                 :            : 
    9145         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0) {
    9146                 :          0 :                         tw32(GRC_MISC_CFG, (1 << 29));
    9147                 :          0 :                         val |= (1 << 29);
    9148                 :            :                 }
    9149                 :            :         }
    9150                 :            : 
    9151         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
    9152                 :          0 :                 tw32(VCPU_STATUS, tr32(VCPU_STATUS) | VCPU_STATUS_DRV_RESET);
    9153                 :          0 :                 tw32(GRC_VCPU_EXT_CTRL,
    9154                 :            :                      tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU);
    9155                 :            :         }
    9156                 :            : 
    9157                 :            :         /* Set the clock to the highest frequency to avoid timeouts. With link
    9158                 :            :          * aware mode, the clock speed could be slow and bootcode does not
    9159                 :            :          * complete within the expected time. Override the clock to allow the
    9160                 :            :          * bootcode to finish sooner and then restore it.
    9161                 :            :          */
    9162                 :          0 :         tg3_override_clk(tp);
    9163                 :            : 
    9164                 :            :         /* Manage gphy power for all CPMU absent PCIe devices. */
    9165   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, CPMU_PRESENT))
    9166                 :          0 :                 val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
    9167                 :            : 
    9168                 :          0 :         tw32(GRC_MISC_CFG, val);
    9169                 :            : 
    9170                 :            :         /* restore 5701 hardware bug workaround write method */
    9171                 :          0 :         tp->write32 = write_op;
    9172                 :            : 
    9173                 :            :         /* Unfortunately, we have to delay before the PCI read back.
    9174                 :            :          * Some 575X chips even will not respond to a PCI cfg access
    9175                 :            :          * when the reset command is given to the chip.
    9176                 :            :          *
    9177                 :            :          * How do these hardware designers expect things to work
    9178                 :            :          * properly if the PCI write is posted for a long period
    9179                 :            :          * of time?  It is always necessary to have some method by
    9180                 :            :          * which a register read back can occur to push the write
    9181                 :            :          * out which does the reset.
    9182                 :            :          *
    9183                 :            :          * For most tg3 variants the trick below was working.
    9184                 :            :          * Ho hum...
    9185                 :            :          */
    9186                 :          0 :         udelay(120);
    9187                 :            : 
    9188                 :            :         /* Flush PCI posted writes.  The normal MMIO registers
    9189                 :            :          * are inaccessible at this time so this is the only
    9190                 :            :          * way to make this reliably (actually, this is no longer
    9191                 :            :          * the case, see above).  I tried to use indirect
    9192                 :            :          * register read/write but this upset some 5701 variants.
    9193                 :            :          */
    9194                 :          0 :         pci_read_config_dword(tp->pdev, PCI_COMMAND, &val);
    9195                 :            : 
    9196                 :          0 :         udelay(120);
    9197                 :            : 
    9198   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS) && pci_is_pcie(tp->pdev)) {
    9199                 :          0 :                 u16 val16;
    9200                 :            : 
    9201         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5750_A0) {
    9202                 :            :                         int j;
    9203                 :            :                         u32 cfg_val;
    9204                 :            : 
    9205                 :            :                         /* Wait for link training to complete.  */
    9206         [ #  # ]:          0 :                         for (j = 0; j < 5000; j++)
    9207                 :          0 :                                 udelay(100);
    9208                 :            : 
    9209                 :          0 :                         pci_read_config_dword(tp->pdev, 0xc4, &cfg_val);
    9210                 :          0 :                         pci_write_config_dword(tp->pdev, 0xc4,
    9211                 :            :                                                cfg_val | (1 << 15));
    9212                 :            :                 }
    9213                 :            : 
    9214                 :            :                 /* Clear the "no snoop" and "relaxed ordering" bits. */
    9215                 :          0 :                 val16 = PCI_EXP_DEVCTL_RELAX_EN | PCI_EXP_DEVCTL_NOSNOOP_EN;
    9216                 :            :                 /*
    9217                 :            :                  * Older PCIe devices only support the 128 byte
    9218                 :            :                  * MPS setting.  Enforce the restriction.
    9219                 :            :                  */
    9220         [ #  # ]:          0 :                 if (!tg3_flag(tp, CPMU_PRESENT))
    9221                 :          0 :                         val16 |= PCI_EXP_DEVCTL_PAYLOAD;
    9222                 :          0 :                 pcie_capability_clear_word(tp->pdev, PCI_EXP_DEVCTL, val16);
    9223                 :            : 
    9224                 :            :                 /* Clear error status */
    9225                 :          0 :                 pcie_capability_write_word(tp->pdev, PCI_EXP_DEVSTA,
    9226                 :            :                                       PCI_EXP_DEVSTA_CED |
    9227                 :            :                                       PCI_EXP_DEVSTA_NFED |
    9228                 :            :                                       PCI_EXP_DEVSTA_FED |
    9229                 :            :                                       PCI_EXP_DEVSTA_URD);
    9230                 :            :         }
    9231                 :            : 
    9232                 :          0 :         tg3_restore_pci_state(tp);
    9233                 :            : 
    9234                 :          0 :         tg3_flag_clear(tp, CHIP_RESETTING);
    9235                 :          0 :         tg3_flag_clear(tp, ERROR_PROCESSED);
    9236                 :            : 
    9237                 :          0 :         val = 0;
    9238         [ #  # ]:          0 :         if (tg3_flag(tp, 5780_CLASS))
    9239                 :          0 :                 val = tr32(MEMARB_MODE);
    9240                 :          0 :         tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
    9241                 :            : 
    9242         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5750_A3) {
    9243                 :          0 :                 tg3_stop_fw(tp);
    9244                 :          0 :                 tw32(0x5000, 0x400);
    9245                 :            :         }
    9246                 :            : 
    9247         [ #  # ]:          0 :         if (tg3_flag(tp, IS_SSB_CORE)) {
    9248                 :            :                 /*
    9249                 :            :                  * BCM4785: In order to avoid repercussions from using
    9250                 :            :                  * potentially defective internal ROM, stop the Rx RISC CPU,
    9251                 :            :                  * which is not required.
    9252                 :            :                  */
    9253                 :          0 :                 tg3_stop_fw(tp);
    9254                 :          0 :                 tg3_halt_cpu(tp, RX_CPU_BASE);
    9255                 :            :         }
    9256                 :            : 
    9257                 :          0 :         err = tg3_poll_fw(tp);
    9258         [ #  # ]:          0 :         if (err)
    9259                 :            :                 return err;
    9260                 :            : 
    9261                 :          0 :         tw32(GRC_MODE, tp->grc_mode);
    9262                 :            : 
    9263         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0) {
    9264                 :          0 :                 val = tr32(0xc4);
    9265                 :            : 
    9266                 :          0 :                 tw32(0xc4, val | (1 << 15));
    9267                 :            :         }
    9268                 :            : 
    9269         [ #  # ]:          0 :         if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 &&
    9270         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5705) {
    9271                 :          0 :                 tp->pci_clock_ctrl |= CLOCK_CTRL_CLKRUN_OENABLE;
    9272         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A0)
    9273                 :          0 :                         tp->pci_clock_ctrl |= CLOCK_CTRL_FORCE_CLKRUN;
    9274                 :          0 :                 tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
    9275                 :            :         }
    9276                 :            : 
    9277         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) {
    9278                 :          0 :                 tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
    9279                 :          0 :                 val = tp->mac_mode;
    9280         [ #  # ]:          0 :         } else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) {
    9281                 :          0 :                 tp->mac_mode = MAC_MODE_PORT_MODE_GMII;
    9282                 :          0 :                 val = tp->mac_mode;
    9283                 :            :         } else
    9284                 :          0 :                 val = 0;
    9285                 :            : 
    9286                 :          0 :         tw32_f(MAC_MODE, val);
    9287                 :          0 :         udelay(40);
    9288                 :            : 
    9289                 :          0 :         tg3_ape_unlock(tp, TG3_APE_LOCK_GRC);
    9290                 :            : 
    9291                 :          0 :         tg3_mdio_start(tp);
    9292                 :            : 
    9293         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS) &&
    9294         [ #  # ]:          0 :             tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0 &&
    9295   [ #  #  #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5785 &&
    9296                 :            :             !tg3_flag(tp, 57765_PLUS)) {
    9297                 :          0 :                 val = tr32(0x7c00);
    9298                 :            : 
    9299                 :          0 :                 tw32(0x7c00, val | (1 << 25));
    9300                 :            :         }
    9301                 :            : 
    9302                 :          0 :         tg3_restore_clk(tp);
    9303                 :            : 
    9304                 :            :         /* Increase the core clock speed to fix tx timeout issue for 5762
    9305                 :            :          * with 100Mbps link speed.
    9306                 :            :          */
    9307         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5762) {
    9308                 :          0 :                 val = tr32(TG3_CPMU_CLCK_ORIDE_ENABLE);
    9309                 :          0 :                 tw32(TG3_CPMU_CLCK_ORIDE_ENABLE, val |
    9310                 :            :                      TG3_CPMU_MAC_ORIDE_ENABLE);
    9311                 :            :         }
    9312                 :            : 
    9313                 :            :         /* Reprobe ASF enable state.  */
    9314                 :          0 :         tg3_flag_clear(tp, ENABLE_ASF);
    9315                 :          0 :         tp->phy_flags &= ~(TG3_PHYFLG_1G_ON_VAUX_OK |
    9316                 :            :                            TG3_PHYFLG_KEEP_LINK_ON_PWRDN);
    9317                 :            : 
    9318                 :          0 :         tg3_flag_clear(tp, ASF_NEW_HANDSHAKE);
    9319                 :          0 :         tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
    9320         [ #  # ]:          0 :         if (val == NIC_SRAM_DATA_SIG_MAGIC) {
    9321                 :          0 :                 u32 nic_cfg;
    9322                 :            : 
    9323                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
    9324         [ #  # ]:          0 :                 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
    9325                 :          0 :                         tg3_flag_set(tp, ENABLE_ASF);
    9326                 :          0 :                         tp->last_event_jiffies = jiffies;
    9327         [ #  # ]:          0 :                         if (tg3_flag(tp, 5750_PLUS))
    9328                 :          0 :                                 tg3_flag_set(tp, ASF_NEW_HANDSHAKE);
    9329                 :            : 
    9330                 :          0 :                         tg3_read_mem(tp, NIC_SRAM_DATA_CFG_3, &nic_cfg);
    9331         [ #  # ]:          0 :                         if (nic_cfg & NIC_SRAM_1G_ON_VAUX_OK)
    9332                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_1G_ON_VAUX_OK;
    9333         [ #  # ]:          0 :                         if (nic_cfg & NIC_SRAM_LNK_FLAP_AVOID)
    9334                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_KEEP_LINK_ON_PWRDN;
    9335                 :            :                 }
    9336                 :            :         }
    9337                 :            : 
    9338                 :            :         return 0;
    9339                 :            : }
    9340                 :            : 
    9341                 :            : static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *);
    9342                 :            : static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *);
    9343                 :            : static void __tg3_set_rx_mode(struct net_device *);
    9344                 :            : 
    9345                 :            : /* tp->lock is held. */
    9346                 :          0 : static int tg3_halt(struct tg3 *tp, int kind, bool silent)
    9347                 :            : {
    9348                 :          0 :         int err;
    9349                 :            : 
    9350                 :          0 :         tg3_stop_fw(tp);
    9351                 :            : 
    9352                 :          0 :         tg3_write_sig_pre_reset(tp, kind);
    9353                 :            : 
    9354                 :          0 :         tg3_abort_hw(tp, silent);
    9355                 :          0 :         err = tg3_chip_reset(tp);
    9356                 :            : 
    9357                 :          0 :         __tg3_set_mac_addr(tp, false);
    9358                 :            : 
    9359                 :          0 :         tg3_write_sig_legacy(tp, kind);
    9360                 :          0 :         tg3_write_sig_post_reset(tp, kind);
    9361                 :            : 
    9362         [ #  # ]:          0 :         if (tp->hw_stats) {
    9363                 :            :                 /* Save the stats across chip resets... */
    9364                 :          0 :                 tg3_get_nstats(tp, &tp->net_stats_prev);
    9365                 :          0 :                 tg3_get_estats(tp, &tp->estats_prev);
    9366                 :            : 
    9367                 :            :                 /* And make sure the next sample is new data */
    9368                 :          0 :                 memset(tp->hw_stats, 0, sizeof(struct tg3_hw_stats));
    9369                 :            :         }
    9370                 :            : 
    9371                 :          0 :         return err;
    9372                 :            : }
    9373                 :            : 
    9374                 :          0 : static int tg3_set_mac_addr(struct net_device *dev, void *p)
    9375                 :            : {
    9376         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
    9377                 :          0 :         struct sockaddr *addr = p;
    9378                 :          0 :         int err = 0;
    9379                 :          0 :         bool skip_mac_1 = false;
    9380                 :            : 
    9381   [ #  #  #  # ]:          0 :         if (!is_valid_ether_addr(addr->sa_data))
    9382                 :            :                 return -EADDRNOTAVAIL;
    9383                 :            : 
    9384                 :          0 :         memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
    9385                 :            : 
    9386         [ #  # ]:          0 :         if (!netif_running(dev))
    9387                 :            :                 return 0;
    9388                 :            : 
    9389         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF)) {
    9390                 :          0 :                 u32 addr0_high, addr0_low, addr1_high, addr1_low;
    9391                 :            : 
    9392                 :          0 :                 addr0_high = tr32(MAC_ADDR_0_HIGH);
    9393                 :          0 :                 addr0_low = tr32(MAC_ADDR_0_LOW);
    9394                 :          0 :                 addr1_high = tr32(MAC_ADDR_1_HIGH);
    9395                 :          0 :                 addr1_low = tr32(MAC_ADDR_1_LOW);
    9396                 :            : 
    9397                 :            :                 /* Skip MAC addr 1 if ASF is using it. */
    9398         [ #  # ]:          0 :                 if ((addr0_high != addr1_high || addr0_low != addr1_low) &&
    9399         [ #  # ]:          0 :                     !(addr1_high == 0 && addr1_low == 0))
    9400                 :          0 :                         skip_mac_1 = true;
    9401                 :            :         }
    9402                 :          0 :         spin_lock_bh(&tp->lock);
    9403                 :          0 :         __tg3_set_mac_addr(tp, skip_mac_1);
    9404                 :          0 :         __tg3_set_rx_mode(dev);
    9405                 :          0 :         spin_unlock_bh(&tp->lock);
    9406                 :            : 
    9407                 :          0 :         return err;
    9408                 :            : }
    9409                 :            : 
    9410                 :            : /* tp->lock is held. */
    9411                 :          0 : static void tg3_set_bdinfo(struct tg3 *tp, u32 bdinfo_addr,
    9412                 :            :                            dma_addr_t mapping, u32 maxlen_flags,
    9413                 :            :                            u32 nic_addr)
    9414                 :            : {
    9415                 :          0 :         tg3_write_mem(tp,
    9416                 :            :                       (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH),
    9417                 :          0 :                       ((u64) mapping >> 32));
    9418                 :          0 :         tg3_write_mem(tp,
    9419                 :            :                       (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW),
    9420                 :            :                       ((u64) mapping & 0xffffffff));
    9421                 :          0 :         tg3_write_mem(tp,
    9422                 :            :                       (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS),
    9423                 :            :                        maxlen_flags);
    9424                 :            : 
    9425         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS))
    9426                 :          0 :                 tg3_write_mem(tp,
    9427                 :            :                               (bdinfo_addr + TG3_BDINFO_NIC_ADDR),
    9428                 :            :                               nic_addr);
    9429                 :          0 : }
    9430                 :            : 
    9431                 :            : 
    9432                 :          0 : static void tg3_coal_tx_init(struct tg3 *tp, struct ethtool_coalesce *ec)
    9433                 :            : {
    9434                 :          0 :         int i = 0;
    9435                 :            : 
    9436         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_TSS)) {
    9437                 :          0 :                 tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs);
    9438                 :          0 :                 tw32(HOSTCC_TXMAX_FRAMES, ec->tx_max_coalesced_frames);
    9439                 :          0 :                 tw32(HOSTCC_TXCOAL_MAXF_INT, ec->tx_max_coalesced_frames_irq);
    9440                 :            :         } else {
    9441                 :          0 :                 tw32(HOSTCC_TXCOL_TICKS, 0);
    9442                 :          0 :                 tw32(HOSTCC_TXMAX_FRAMES, 0);
    9443                 :          0 :                 tw32(HOSTCC_TXCOAL_MAXF_INT, 0);
    9444                 :            : 
    9445         [ #  # ]:          0 :                 for (; i < tp->txq_cnt; i++) {
    9446                 :          0 :                         u32 reg;
    9447                 :            : 
    9448                 :          0 :                         reg = HOSTCC_TXCOL_TICKS_VEC1 + i * 0x18;
    9449                 :          0 :                         tw32(reg, ec->tx_coalesce_usecs);
    9450                 :          0 :                         reg = HOSTCC_TXMAX_FRAMES_VEC1 + i * 0x18;
    9451                 :          0 :                         tw32(reg, ec->tx_max_coalesced_frames);
    9452                 :          0 :                         reg = HOSTCC_TXCOAL_MAXF_INT_VEC1 + i * 0x18;
    9453                 :          0 :                         tw32(reg, ec->tx_max_coalesced_frames_irq);
    9454                 :            :                 }
    9455                 :            :         }
    9456                 :            : 
    9457         [ #  # ]:          0 :         for (; i < tp->irq_max - 1; i++) {
    9458                 :          0 :                 tw32(HOSTCC_TXCOL_TICKS_VEC1 + i * 0x18, 0);
    9459                 :          0 :                 tw32(HOSTCC_TXMAX_FRAMES_VEC1 + i * 0x18, 0);
    9460                 :          0 :                 tw32(HOSTCC_TXCOAL_MAXF_INT_VEC1 + i * 0x18, 0);
    9461                 :            :         }
    9462                 :          0 : }
    9463                 :            : 
    9464                 :          0 : static void tg3_coal_rx_init(struct tg3 *tp, struct ethtool_coalesce *ec)
    9465                 :            : {
    9466                 :          0 :         int i = 0;
    9467                 :          0 :         u32 limit = tp->rxq_cnt;
    9468                 :            : 
    9469         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_RSS)) {
    9470                 :          0 :                 tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs);
    9471                 :          0 :                 tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames);
    9472                 :          0 :                 tw32(HOSTCC_RXCOAL_MAXF_INT, ec->rx_max_coalesced_frames_irq);
    9473                 :          0 :                 limit--;
    9474                 :            :         } else {
    9475                 :          0 :                 tw32(HOSTCC_RXCOL_TICKS, 0);
    9476                 :          0 :                 tw32(HOSTCC_RXMAX_FRAMES, 0);
    9477                 :          0 :                 tw32(HOSTCC_RXCOAL_MAXF_INT, 0);
    9478                 :            :         }
    9479                 :            : 
    9480         [ #  # ]:          0 :         for (; i < limit; i++) {
    9481                 :          0 :                 u32 reg;
    9482                 :            : 
    9483                 :          0 :                 reg = HOSTCC_RXCOL_TICKS_VEC1 + i * 0x18;
    9484                 :          0 :                 tw32(reg, ec->rx_coalesce_usecs);
    9485                 :          0 :                 reg = HOSTCC_RXMAX_FRAMES_VEC1 + i * 0x18;
    9486                 :          0 :                 tw32(reg, ec->rx_max_coalesced_frames);
    9487                 :          0 :                 reg = HOSTCC_RXCOAL_MAXF_INT_VEC1 + i * 0x18;
    9488                 :          0 :                 tw32(reg, ec->rx_max_coalesced_frames_irq);
    9489                 :            :         }
    9490                 :            : 
    9491         [ #  # ]:          0 :         for (; i < tp->irq_max - 1; i++) {
    9492                 :          0 :                 tw32(HOSTCC_RXCOL_TICKS_VEC1 + i * 0x18, 0);
    9493                 :          0 :                 tw32(HOSTCC_RXMAX_FRAMES_VEC1 + i * 0x18, 0);
    9494                 :          0 :                 tw32(HOSTCC_RXCOAL_MAXF_INT_VEC1 + i * 0x18, 0);
    9495                 :            :         }
    9496                 :          0 : }
    9497                 :            : 
    9498                 :          0 : static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
    9499                 :            : {
    9500                 :          0 :         tg3_coal_tx_init(tp, ec);
    9501                 :          0 :         tg3_coal_rx_init(tp, ec);
    9502                 :            : 
    9503         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
    9504                 :          0 :                 u32 val = ec->stats_block_coalesce_usecs;
    9505                 :            : 
    9506                 :          0 :                 tw32(HOSTCC_RXCOAL_TICK_INT, ec->rx_coalesce_usecs_irq);
    9507                 :          0 :                 tw32(HOSTCC_TXCOAL_TICK_INT, ec->tx_coalesce_usecs_irq);
    9508                 :            : 
    9509         [ #  # ]:          0 :                 if (!tp->link_up)
    9510                 :          0 :                         val = 0;
    9511                 :            : 
    9512                 :          0 :                 tw32(HOSTCC_STAT_COAL_TICKS, val);
    9513                 :            :         }
    9514                 :          0 : }
    9515                 :            : 
    9516                 :            : /* tp->lock is held. */
    9517                 :          0 : static void tg3_tx_rcbs_disable(struct tg3 *tp)
    9518                 :            : {
    9519                 :          0 :         u32 txrcb, limit;
    9520                 :            : 
    9521                 :            :         /* Disable all transmit rings but the first. */
    9522         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS))
    9523                 :            :                 limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 16;
    9524         [ #  # ]:          0 :         else if (tg3_flag(tp, 5717_PLUS))
    9525                 :            :                 limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 4;
    9526         [ #  # ]:          0 :         else if (tg3_flag(tp, 57765_CLASS) ||
    9527         [ #  # ]:          0 :                  tg3_asic_rev(tp) == ASIC_REV_5762)
    9528                 :            :                 limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 2;
    9529                 :            :         else
    9530                 :          0 :                 limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE;
    9531                 :            : 
    9532                 :          0 :         for (txrcb = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE;
    9533         [ #  # ]:          0 :              txrcb < limit; txrcb += TG3_BDINFO_SIZE)
    9534                 :          0 :                 tg3_write_mem(tp, txrcb + TG3_BDINFO_MAXLEN_FLAGS,
    9535                 :            :                               BDINFO_FLAGS_DISABLED);
    9536                 :          0 : }
    9537                 :            : 
    9538                 :            : /* tp->lock is held. */
    9539                 :          0 : static void tg3_tx_rcbs_init(struct tg3 *tp)
    9540                 :            : {
    9541                 :          0 :         int i = 0;
    9542                 :          0 :         u32 txrcb = NIC_SRAM_SEND_RCB;
    9543                 :            : 
    9544         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_TSS))
    9545                 :          0 :                 i++;
    9546                 :            : 
    9547         [ #  # ]:          0 :         for (; i < tp->irq_max; i++, txrcb += TG3_BDINFO_SIZE) {
    9548                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    9549                 :            : 
    9550         [ #  # ]:          0 :                 if (!tnapi->tx_ring)
    9551                 :          0 :                         continue;
    9552                 :            : 
    9553                 :          0 :                 tg3_set_bdinfo(tp, txrcb, tnapi->tx_desc_mapping,
    9554                 :            :                                (TG3_TX_RING_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT),
    9555                 :            :                                NIC_SRAM_TX_BUFFER_DESC);
    9556                 :            :         }
    9557                 :          0 : }
    9558                 :            : 
    9559                 :            : /* tp->lock is held. */
    9560                 :          0 : static void tg3_rx_ret_rcbs_disable(struct tg3 *tp)
    9561                 :            : {
    9562                 :          0 :         u32 rxrcb, limit;
    9563                 :            : 
    9564                 :            :         /* Disable all receive return rings but the first. */
    9565         [ #  # ]:          0 :         if (tg3_flag(tp, 5717_PLUS))
    9566                 :            :                 limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 17;
    9567         [ #  # ]:          0 :         else if (!tg3_flag(tp, 5705_PLUS))
    9568                 :            :                 limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 16;
    9569         [ #  # ]:          0 :         else if (tg3_asic_rev(tp) == ASIC_REV_5755 ||
    9570         [ #  # ]:          0 :                  tg3_asic_rev(tp) == ASIC_REV_5762 ||
    9571                 :            :                  tg3_flag(tp, 57765_CLASS))
    9572                 :            :                 limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 4;
    9573                 :            :         else
    9574                 :            :                 limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE;
    9575                 :            : 
    9576                 :          0 :         for (rxrcb = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE;
    9577         [ #  # ]:          0 :              rxrcb < limit; rxrcb += TG3_BDINFO_SIZE)
    9578                 :          0 :                 tg3_write_mem(tp, rxrcb + TG3_BDINFO_MAXLEN_FLAGS,
    9579                 :            :                               BDINFO_FLAGS_DISABLED);
    9580                 :          0 : }
    9581                 :            : 
    9582                 :            : /* tp->lock is held. */
    9583                 :          0 : static void tg3_rx_ret_rcbs_init(struct tg3 *tp)
    9584                 :            : {
    9585                 :          0 :         int i = 0;
    9586                 :          0 :         u32 rxrcb = NIC_SRAM_RCV_RET_RCB;
    9587                 :            : 
    9588         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_RSS))
    9589                 :          0 :                 i++;
    9590                 :            : 
    9591         [ #  # ]:          0 :         for (; i < tp->irq_max; i++, rxrcb += TG3_BDINFO_SIZE) {
    9592                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
    9593                 :            : 
    9594         [ #  # ]:          0 :                 if (!tnapi->rx_rcb)
    9595                 :          0 :                         continue;
    9596                 :            : 
    9597                 :          0 :                 tg3_set_bdinfo(tp, rxrcb, tnapi->rx_rcb_mapping,
    9598                 :          0 :                                (tp->rx_ret_ring_mask + 1) <<
    9599                 :            :                                 BDINFO_FLAGS_MAXLEN_SHIFT, 0);
    9600                 :            :         }
    9601                 :          0 : }
    9602                 :            : 
    9603                 :            : /* tp->lock is held. */
    9604                 :          0 : static void tg3_rings_reset(struct tg3 *tp)
    9605                 :            : {
    9606                 :          0 :         int i;
    9607                 :          0 :         u32 stblk;
    9608                 :          0 :         struct tg3_napi *tnapi = &tp->napi[0];
    9609                 :            : 
    9610                 :          0 :         tg3_tx_rcbs_disable(tp);
    9611                 :            : 
    9612                 :          0 :         tg3_rx_ret_rcbs_disable(tp);
    9613                 :            : 
    9614                 :            :         /* Disable interrupts */
    9615                 :          0 :         tw32_mailbox_f(tp->napi[0].int_mbox, 1);
    9616                 :          0 :         tp->napi[0].chk_msi_cnt = 0;
    9617                 :          0 :         tp->napi[0].last_rx_cons = 0;
    9618                 :          0 :         tp->napi[0].last_tx_cons = 0;
    9619                 :            : 
    9620                 :            :         /* Zero mailbox registers. */
    9621         [ #  # ]:          0 :         if (tg3_flag(tp, SUPPORT_MSIX)) {
    9622         [ #  # ]:          0 :                 for (i = 1; i < tp->irq_max; i++) {
    9623                 :          0 :                         tp->napi[i].tx_prod = 0;
    9624                 :          0 :                         tp->napi[i].tx_cons = 0;
    9625         [ #  # ]:          0 :                         if (tg3_flag(tp, ENABLE_TSS))
    9626                 :          0 :                                 tw32_mailbox(tp->napi[i].prodmbox, 0);
    9627                 :          0 :                         tw32_rx_mbox(tp->napi[i].consmbox, 0);
    9628                 :          0 :                         tw32_mailbox_f(tp->napi[i].int_mbox, 1);
    9629                 :          0 :                         tp->napi[i].chk_msi_cnt = 0;
    9630                 :          0 :                         tp->napi[i].last_rx_cons = 0;
    9631                 :          0 :                         tp->napi[i].last_tx_cons = 0;
    9632                 :            :                 }
    9633         [ #  # ]:          0 :                 if (!tg3_flag(tp, ENABLE_TSS))
    9634                 :          0 :                         tw32_mailbox(tp->napi[0].prodmbox, 0);
    9635                 :            :         } else {
    9636                 :          0 :                 tp->napi[0].tx_prod = 0;
    9637                 :          0 :                 tp->napi[0].tx_cons = 0;
    9638                 :          0 :                 tw32_mailbox(tp->napi[0].prodmbox, 0);
    9639                 :          0 :                 tw32_rx_mbox(tp->napi[0].consmbox, 0);
    9640                 :            :         }
    9641                 :            : 
    9642                 :            :         /* Make sure the NIC-based send BD rings are disabled. */
    9643         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
    9644                 :            :                 u32 mbox = MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW;
    9645         [ #  # ]:          0 :                 for (i = 0; i < 16; i++)
    9646                 :          0 :                         tw32_tx_mbox(mbox + i * 8, 0);
    9647                 :            :         }
    9648                 :            : 
    9649                 :            :         /* Clear status block in ram. */
    9650                 :          0 :         memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE);
    9651                 :            : 
    9652                 :            :         /* Set status block DMA address */
    9653                 :          0 :         tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
    9654                 :            :              ((u64) tnapi->status_mapping >> 32));
    9655                 :          0 :         tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
    9656                 :            :              ((u64) tnapi->status_mapping & 0xffffffff));
    9657                 :            : 
    9658                 :          0 :         stblk = HOSTCC_STATBLCK_RING1;
    9659                 :            : 
    9660         [ #  # ]:          0 :         for (i = 1, tnapi++; i < tp->irq_cnt; i++, tnapi++) {
    9661                 :          0 :                 u64 mapping = (u64)tnapi->status_mapping;
    9662                 :          0 :                 tw32(stblk + TG3_64BIT_REG_HIGH, mapping >> 32);
    9663                 :          0 :                 tw32(stblk + TG3_64BIT_REG_LOW, mapping & 0xffffffff);
    9664                 :          0 :                 stblk += 8;
    9665                 :            : 
    9666                 :            :                 /* Clear status block in ram. */
    9667                 :          0 :                 memset(tnapi->hw_status, 0, TG3_HW_STATUS_SIZE);
    9668                 :            :         }
    9669                 :            : 
    9670                 :          0 :         tg3_tx_rcbs_init(tp);
    9671                 :          0 :         tg3_rx_ret_rcbs_init(tp);
    9672                 :          0 : }
    9673                 :            : 
    9674                 :          0 : static void tg3_setup_rxbd_thresholds(struct tg3 *tp)
    9675                 :            : {
    9676                 :          0 :         u32 val, bdcache_maxcnt, host_rep_thresh, nic_rep_thresh;
    9677                 :            : 
    9678   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, 5750_PLUS) ||
    9679                 :          0 :             tg3_flag(tp, 5780_CLASS) ||
    9680   [ #  #  #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5750 ||
    9681         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5752 ||
    9682                 :            :             tg3_flag(tp, 57765_PLUS))
    9683                 :            :                 bdcache_maxcnt = TG3_SRAM_RX_STD_BDCACHE_SIZE_5700;
    9684         [ #  # ]:          0 :         else if (tg3_asic_rev(tp) == ASIC_REV_5755 ||
    9685                 :            :                  tg3_asic_rev(tp) == ASIC_REV_5787)
    9686                 :            :                 bdcache_maxcnt = TG3_SRAM_RX_STD_BDCACHE_SIZE_5755;
    9687                 :            :         else
    9688                 :          0 :                 bdcache_maxcnt = TG3_SRAM_RX_STD_BDCACHE_SIZE_5906;
    9689                 :            : 
    9690                 :          0 :         nic_rep_thresh = min(bdcache_maxcnt / 2, tp->rx_std_max_post);
    9691                 :          0 :         host_rep_thresh = max_t(u32, tp->rx_pending / 8, 1);
    9692                 :            : 
    9693                 :          0 :         val = min(nic_rep_thresh, host_rep_thresh);
    9694                 :          0 :         tw32(RCVBDI_STD_THRESH, val);
    9695                 :            : 
    9696         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS))
    9697                 :          0 :                 tw32(STD_REPLENISH_LWM, bdcache_maxcnt);
    9698                 :            : 
    9699   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, JUMBO_CAPABLE) || tg3_flag(tp, 5780_CLASS))
    9700                 :          0 :                 return;
    9701                 :            : 
    9702                 :          0 :         bdcache_maxcnt = TG3_SRAM_RX_JMB_BDCACHE_SIZE_5700;
    9703                 :            : 
    9704                 :          0 :         host_rep_thresh = max_t(u32, tp->rx_jumbo_pending / 8, 1);
    9705                 :            : 
    9706                 :          0 :         val = min(bdcache_maxcnt / 2, host_rep_thresh);
    9707                 :          0 :         tw32(RCVBDI_JUMBO_THRESH, val);
    9708                 :            : 
    9709         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS))
    9710                 :          0 :                 tw32(JMB_REPLENISH_LWM, bdcache_maxcnt);
    9711                 :            : }
    9712                 :            : 
    9713                 :          0 : static inline u32 calc_crc(unsigned char *buf, int len)
    9714                 :            : {
    9715                 :          0 :         u32 reg;
    9716                 :          0 :         u32 tmp;
    9717                 :          0 :         int j, k;
    9718                 :            : 
    9719                 :          0 :         reg = 0xffffffff;
    9720                 :            : 
    9721   [ #  #  #  #  :          0 :         for (j = 0; j < len; j++) {
                   #  # ]
    9722                 :          0 :                 reg ^= buf[j];
    9723                 :            : 
    9724   [ #  #  #  #  :          0 :                 for (k = 0; k < 8; k++) {
                   #  # ]
    9725                 :          0 :                         tmp = reg & 0x01;
    9726                 :            : 
    9727                 :          0 :                         reg >>= 1;
    9728                 :            : 
    9729   [ #  #  #  #  :          0 :                         if (tmp)
                   #  # ]
    9730                 :          0 :                                 reg ^= CRC32_POLY_LE;
    9731                 :            :                 }
    9732                 :            :         }
    9733                 :            : 
    9734                 :          0 :         return ~reg;
    9735                 :            : }
    9736                 :            : 
    9737                 :          0 : static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
    9738                 :            : {
    9739                 :            :         /* accept or reject all multicast frames */
    9740         [ #  # ]:          0 :         tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
    9741                 :          0 :         tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
    9742                 :          0 :         tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
    9743                 :          0 :         tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
    9744                 :          0 : }
    9745                 :            : 
    9746                 :          0 : static void __tg3_set_rx_mode(struct net_device *dev)
    9747                 :            : {
    9748                 :          0 :         struct tg3 *tp = netdev_priv(dev);
    9749                 :          0 :         u32 rx_mode;
    9750                 :            : 
    9751                 :          0 :         rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
    9752                 :            :                                   RX_MODE_KEEP_VLAN_TAG);
    9753                 :            : 
    9754                 :            : #if !defined(CONFIG_VLAN_8021Q) && !defined(CONFIG_VLAN_8021Q_MODULE)
    9755                 :            :         /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
    9756                 :            :          * flag clear.
    9757                 :            :          */
    9758         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_ASF))
    9759                 :          0 :                 rx_mode |= RX_MODE_KEEP_VLAN_TAG;
    9760                 :            : #endif
    9761                 :            : 
    9762         [ #  # ]:          0 :         if (dev->flags & IFF_PROMISC) {
    9763                 :            :                 /* Promiscuous mode. */
    9764                 :          0 :                 rx_mode |= RX_MODE_PROMISC;
    9765         [ #  # ]:          0 :         } else if (dev->flags & IFF_ALLMULTI) {
    9766                 :            :                 /* Accept all multicast. */
    9767                 :          0 :                 tg3_set_multi(tp, 1);
    9768         [ #  # ]:          0 :         } else if (netdev_mc_empty(dev)) {
    9769                 :            :                 /* Reject all multicast. */
    9770                 :          0 :                 tg3_set_multi(tp, 0);
    9771                 :            :         } else {
    9772                 :            :                 /* Accept one or more multicast(s). */
    9773                 :          0 :                 struct netdev_hw_addr *ha;
    9774                 :          0 :                 u32 mc_filter[4] = { 0, };
    9775                 :          0 :                 u32 regidx;
    9776                 :          0 :                 u32 bit;
    9777                 :          0 :                 u32 crc;
    9778                 :            : 
    9779         [ #  # ]:          0 :                 netdev_for_each_mc_addr(ha, dev) {
    9780                 :          0 :                         crc = calc_crc(ha->addr, ETH_ALEN);
    9781                 :          0 :                         bit = ~crc & 0x7f;
    9782                 :          0 :                         regidx = (bit & 0x60) >> 5;
    9783                 :          0 :                         bit &= 0x1f;
    9784                 :          0 :                         mc_filter[regidx] |= (1 << bit);
    9785                 :            :                 }
    9786                 :            : 
    9787                 :          0 :                 tw32(MAC_HASH_REG_0, mc_filter[0]);
    9788                 :          0 :                 tw32(MAC_HASH_REG_1, mc_filter[1]);
    9789                 :          0 :                 tw32(MAC_HASH_REG_2, mc_filter[2]);
    9790                 :          0 :                 tw32(MAC_HASH_REG_3, mc_filter[3]);
    9791                 :            :         }
    9792                 :            : 
    9793   [ #  #  #  # ]:          0 :         if (netdev_uc_count(dev) > TG3_MAX_UCAST_ADDR(tp)) {
    9794                 :          0 :                 rx_mode |= RX_MODE_PROMISC;
    9795         [ #  # ]:          0 :         } else if (!(dev->flags & IFF_PROMISC)) {
    9796                 :            :                 /* Add all entries into to the mac addr filter list */
    9797                 :          0 :                 int i = 0;
    9798                 :          0 :                 struct netdev_hw_addr *ha;
    9799                 :            : 
    9800         [ #  # ]:          0 :                 netdev_for_each_uc_addr(ha, dev) {
    9801                 :          0 :                         __tg3_set_one_mac_addr(tp, ha->addr,
    9802         [ #  # ]:          0 :                                                i + TG3_UCAST_ADDR_IDX(tp));
    9803                 :          0 :                         i++;
    9804                 :            :                 }
    9805                 :            :         }
    9806                 :            : 
    9807         [ #  # ]:          0 :         if (rx_mode != tp->rx_mode) {
    9808                 :          0 :                 tp->rx_mode = rx_mode;
    9809                 :          0 :                 tw32_f(MAC_RX_MODE, rx_mode);
    9810                 :          0 :                 udelay(10);
    9811                 :            :         }
    9812                 :          0 : }
    9813                 :            : 
    9814                 :          0 : static void tg3_rss_init_dflt_indir_tbl(struct tg3 *tp, u32 qcnt)
    9815                 :            : {
    9816                 :          0 :         int i;
    9817                 :            : 
    9818   [ #  #  #  # ]:          0 :         for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++)
    9819                 :          0 :                 tp->rss_ind_tbl[i] = ethtool_rxfh_indir_default(i, qcnt);
    9820                 :            : }
    9821                 :            : 
    9822                 :          0 : static void tg3_rss_check_indir_tbl(struct tg3 *tp)
    9823                 :            : {
    9824                 :          0 :         int i;
    9825                 :            : 
    9826         [ #  # ]:          0 :         if (!tg3_flag(tp, SUPPORT_MSIX))
    9827                 :            :                 return;
    9828                 :            : 
    9829         [ #  # ]:          0 :         if (tp->rxq_cnt == 1) {
    9830                 :          0 :                 memset(&tp->rss_ind_tbl[0], 0, sizeof(tp->rss_ind_tbl));
    9831                 :          0 :                 return;
    9832                 :            :         }
    9833                 :            : 
    9834                 :            :         /* Validate table against current IRQ count */
    9835         [ #  # ]:          0 :         for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++) {
    9836         [ #  # ]:          0 :                 if (tp->rss_ind_tbl[i] >= tp->rxq_cnt)
    9837                 :            :                         break;
    9838                 :            :         }
    9839                 :            : 
    9840         [ #  # ]:          0 :         if (i != TG3_RSS_INDIR_TBL_SIZE)
    9841                 :            :                 tg3_rss_init_dflt_indir_tbl(tp, tp->rxq_cnt);
    9842                 :            : }
    9843                 :            : 
    9844                 :          0 : static void tg3_rss_write_indir_tbl(struct tg3 *tp)
    9845                 :            : {
    9846                 :          0 :         int i = 0;
    9847                 :          0 :         u32 reg = MAC_RSS_INDIR_TBL_0;
    9848                 :            : 
    9849         [ #  # ]:          0 :         while (i < TG3_RSS_INDIR_TBL_SIZE) {
    9850                 :          0 :                 u32 val = tp->rss_ind_tbl[i];
    9851                 :          0 :                 i++;
    9852         [ #  # ]:          0 :                 for (; i % 8; i++) {
    9853                 :          0 :                         val <<= 4;
    9854                 :          0 :                         val |= tp->rss_ind_tbl[i];
    9855                 :            :                 }
    9856                 :          0 :                 tw32(reg, val);
    9857                 :          0 :                 reg += 4;
    9858                 :            :         }
    9859                 :          0 : }
    9860                 :            : 
    9861                 :          0 : static inline u32 tg3_lso_rd_dma_workaround_bit(struct tg3 *tp)
    9862                 :            : {
    9863                 :          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5719)
    9864                 :            :                 return TG3_LSO_RD_DMA_TX_LENGTH_WA_5719;
    9865                 :            :         else
    9866                 :          0 :                 return TG3_LSO_RD_DMA_TX_LENGTH_WA_5720;
    9867                 :            : }
    9868                 :            : 
    9869                 :            : /* tp->lock is held. */
    9870                 :          0 : static int tg3_reset_hw(struct tg3 *tp, bool reset_phy)
    9871                 :            : {
    9872                 :          0 :         u32 val, rdmac_mode;
    9873                 :          0 :         int i, err, limit;
    9874                 :          0 :         struct tg3_rx_prodring_set *tpr = &tp->napi[0].prodring;
    9875                 :            : 
    9876                 :          0 :         tg3_disable_ints(tp);
    9877                 :            : 
    9878                 :          0 :         tg3_stop_fw(tp);
    9879                 :            : 
    9880                 :          0 :         tg3_write_sig_pre_reset(tp, RESET_KIND_INIT);
    9881                 :            : 
    9882         [ #  # ]:          0 :         if (tg3_flag(tp, INIT_COMPLETE))
    9883                 :          0 :                 tg3_abort_hw(tp, 1);
    9884                 :            : 
    9885         [ #  # ]:          0 :         if ((tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) &&
    9886                 :            :             !(tp->phy_flags & TG3_PHYFLG_USER_CONFIGURED)) {
    9887                 :          0 :                 tg3_phy_pull_config(tp);
    9888                 :          0 :                 tg3_eee_pull_config(tp, NULL);
    9889                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED;
    9890                 :            :         }
    9891                 :            : 
    9892                 :            :         /* Enable MAC control of LPI */
    9893         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_EEE_CAP)
    9894                 :          0 :                 tg3_setup_eee(tp);
    9895                 :            : 
    9896         [ #  # ]:          0 :         if (reset_phy)
    9897                 :          0 :                 tg3_phy_reset(tp);
    9898                 :            : 
    9899                 :          0 :         err = tg3_chip_reset(tp);
    9900         [ #  # ]:          0 :         if (err)
    9901                 :            :                 return err;
    9902                 :            : 
    9903                 :          0 :         tg3_write_sig_legacy(tp, RESET_KIND_INIT);
    9904                 :            : 
    9905         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5784_AX) {
    9906                 :          0 :                 val = tr32(TG3_CPMU_CTRL);
    9907                 :          0 :                 val &= ~(CPMU_CTRL_LINK_AWARE_MODE | CPMU_CTRL_LINK_IDLE_MODE);
    9908                 :          0 :                 tw32(TG3_CPMU_CTRL, val);
    9909                 :            : 
    9910                 :          0 :                 val = tr32(TG3_CPMU_LSPD_10MB_CLK);
    9911                 :          0 :                 val &= ~CPMU_LSPD_10MB_MACCLK_MASK;
    9912                 :          0 :                 val |= CPMU_LSPD_10MB_MACCLK_6_25;
    9913                 :          0 :                 tw32(TG3_CPMU_LSPD_10MB_CLK, val);
    9914                 :            : 
    9915                 :          0 :                 val = tr32(TG3_CPMU_LNK_AWARE_PWRMD);
    9916                 :          0 :                 val &= ~CPMU_LNK_AWARE_MACCLK_MASK;
    9917                 :          0 :                 val |= CPMU_LNK_AWARE_MACCLK_6_25;
    9918                 :          0 :                 tw32(TG3_CPMU_LNK_AWARE_PWRMD, val);
    9919                 :            : 
    9920                 :          0 :                 val = tr32(TG3_CPMU_HST_ACC);
    9921                 :          0 :                 val &= ~CPMU_HST_ACC_MACCLK_MASK;
    9922                 :          0 :                 val |= CPMU_HST_ACC_MACCLK_6_25;
    9923                 :          0 :                 tw32(TG3_CPMU_HST_ACC, val);
    9924                 :            :         }
    9925                 :            : 
    9926         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57780) {
    9927                 :          0 :                 val = tr32(PCIE_PWR_MGMT_THRESH) & ~PCIE_PWR_MGMT_L1_THRESH_MSK;
    9928                 :          0 :                 val |= PCIE_PWR_MGMT_EXT_ASPM_TMR_EN |
    9929                 :            :                        PCIE_PWR_MGMT_L1_THRESH_4MS;
    9930                 :          0 :                 tw32(PCIE_PWR_MGMT_THRESH, val);
    9931                 :            : 
    9932                 :          0 :                 val = tr32(TG3_PCIE_EIDLE_DELAY) & ~TG3_PCIE_EIDLE_DELAY_MASK;
    9933                 :          0 :                 tw32(TG3_PCIE_EIDLE_DELAY, val | TG3_PCIE_EIDLE_DELAY_13_CLKS);
    9934                 :            : 
    9935                 :          0 :                 tw32(TG3_CORR_ERR_STAT, TG3_CORR_ERR_STAT_CLEAR);
    9936                 :            : 
    9937                 :          0 :                 val = tr32(TG3_PCIE_LNKCTL) & ~TG3_PCIE_LNKCTL_L1_PLL_PD_EN;
    9938                 :          0 :                 tw32(TG3_PCIE_LNKCTL, val | TG3_PCIE_LNKCTL_L1_PLL_PD_DIS);
    9939                 :            :         }
    9940                 :            : 
    9941         [ #  # ]:          0 :         if (tg3_flag(tp, L1PLLPD_EN)) {
    9942                 :          0 :                 u32 grc_mode = tr32(GRC_MODE);
    9943                 :            : 
    9944                 :            :                 /* Access the lower 1K of PL PCIE block registers. */
    9945                 :          0 :                 val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK;
    9946                 :          0 :                 tw32(GRC_MODE, val | GRC_MODE_PCIE_PL_SEL);
    9947                 :            : 
    9948                 :          0 :                 val = tr32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_PL_LO_PHYCTL1);
    9949                 :          0 :                 tw32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_PL_LO_PHYCTL1,
    9950                 :            :                      val | TG3_PCIE_PL_LO_PHYCTL1_L1PLLPD_EN);
    9951                 :            : 
    9952                 :          0 :                 tw32(GRC_MODE, grc_mode);
    9953                 :            :         }
    9954                 :            : 
    9955         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_CLASS)) {
    9956         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0) {
    9957                 :          0 :                         u32 grc_mode = tr32(GRC_MODE);
    9958                 :            : 
    9959                 :            :                         /* Access the lower 1K of PL PCIE block registers. */
    9960                 :          0 :                         val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK;
    9961                 :          0 :                         tw32(GRC_MODE, val | GRC_MODE_PCIE_PL_SEL);
    9962                 :            : 
    9963                 :          0 :                         val = tr32(TG3_PCIE_TLDLPL_PORT +
    9964                 :            :                                    TG3_PCIE_PL_LO_PHYCTL5);
    9965                 :          0 :                         tw32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_PL_LO_PHYCTL5,
    9966                 :            :                              val | TG3_PCIE_PL_LO_PHYCTL5_DIS_L2CLKREQ);
    9967                 :            : 
    9968                 :          0 :                         tw32(GRC_MODE, grc_mode);
    9969                 :            :                 }
    9970                 :            : 
    9971         [ #  # ]:          0 :                 if (tg3_chip_rev(tp) != CHIPREV_57765_AX) {
    9972                 :          0 :                         u32 grc_mode;
    9973                 :            : 
    9974                 :            :                         /* Fix transmit hangs */
    9975                 :          0 :                         val = tr32(TG3_CPMU_PADRNG_CTL);
    9976                 :          0 :                         val |= TG3_CPMU_PADRNG_CTL_RDIV2;
    9977                 :          0 :                         tw32(TG3_CPMU_PADRNG_CTL, val);
    9978                 :            : 
    9979                 :          0 :                         grc_mode = tr32(GRC_MODE);
    9980                 :            : 
    9981                 :            :                         /* Access the lower 1K of DL PCIE block registers. */
    9982                 :          0 :                         val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK;
    9983                 :          0 :                         tw32(GRC_MODE, val | GRC_MODE_PCIE_DL_SEL);
    9984                 :            : 
    9985                 :          0 :                         val = tr32(TG3_PCIE_TLDLPL_PORT +
    9986                 :            :                                    TG3_PCIE_DL_LO_FTSMAX);
    9987                 :          0 :                         val &= ~TG3_PCIE_DL_LO_FTSMAX_MSK;
    9988                 :          0 :                         tw32(TG3_PCIE_TLDLPL_PORT + TG3_PCIE_DL_LO_FTSMAX,
    9989                 :            :                              val | TG3_PCIE_DL_LO_FTSMAX_VAL);
    9990                 :            : 
    9991                 :          0 :                         tw32(GRC_MODE, grc_mode);
    9992                 :            :                 }
    9993                 :            : 
    9994                 :          0 :                 val = tr32(TG3_CPMU_LSPD_10MB_CLK);
    9995                 :          0 :                 val &= ~CPMU_LSPD_10MB_MACCLK_MASK;
    9996                 :          0 :                 val |= CPMU_LSPD_10MB_MACCLK_6_25;
    9997                 :          0 :                 tw32(TG3_CPMU_LSPD_10MB_CLK, val);
    9998                 :            :         }
    9999                 :            : 
   10000                 :            :         /* This works around an issue with Athlon chipsets on
   10001                 :            :          * B3 tigon3 silicon.  This bit has no effect on any
   10002                 :            :          * other revision.  But do not set this on PCI Express
   10003                 :            :          * chips and don't even touch the clocks if the CPMU is present.
   10004                 :            :          */
   10005         [ #  # ]:          0 :         if (!tg3_flag(tp, CPMU_PRESENT)) {
   10006         [ #  # ]:          0 :                 if (!tg3_flag(tp, PCI_EXPRESS))
   10007                 :          0 :                         tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT;
   10008                 :          0 :                 tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
   10009                 :            :         }
   10010                 :            : 
   10011   [ #  #  #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0 &&
   10012                 :            :             tg3_flag(tp, PCIX_MODE)) {
   10013                 :          0 :                 val = tr32(TG3PCI_PCISTATE);
   10014                 :          0 :                 val |= PCISTATE_RETRY_SAME_DMA;
   10015                 :          0 :                 tw32(TG3PCI_PCISTATE, val);
   10016                 :            :         }
   10017                 :            : 
   10018         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE)) {
   10019                 :            :                 /* Allow reads and writes to the
   10020                 :            :                  * APE register and memory space.
   10021                 :            :                  */
   10022                 :          0 :                 val = tr32(TG3PCI_PCISTATE);
   10023                 :          0 :                 val |= PCISTATE_ALLOW_APE_CTLSPC_WR |
   10024                 :            :                        PCISTATE_ALLOW_APE_SHMEM_WR |
   10025                 :            :                        PCISTATE_ALLOW_APE_PSPACE_WR;
   10026                 :          0 :                 tw32(TG3PCI_PCISTATE, val);
   10027                 :            :         }
   10028                 :            : 
   10029         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5704_BX) {
   10030                 :            :                 /* Enable some hw fixes.  */
   10031                 :          0 :                 val = tr32(TG3PCI_MSI_DATA);
   10032                 :          0 :                 val |= (1 << 26) | (1 << 28) | (1 << 29);
   10033                 :          0 :                 tw32(TG3PCI_MSI_DATA, val);
   10034                 :            :         }
   10035                 :            : 
   10036                 :            :         /* Descriptor ring init may make accesses to the
   10037                 :            :          * NIC SRAM area to setup the TX descriptors, so we
   10038                 :            :          * can only do this after the hardware has been
   10039                 :            :          * successfully reset.
   10040                 :            :          */
   10041                 :          0 :         err = tg3_init_rings(tp);
   10042         [ #  # ]:          0 :         if (err)
   10043                 :            :                 return err;
   10044                 :            : 
   10045         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS)) {
   10046                 :          0 :                 val = tr32(TG3PCI_DMA_RW_CTRL) &
   10047                 :            :                       ~DMA_RWCTRL_DIS_CACHE_ALIGNMENT;
   10048         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_57765_A0)
   10049                 :          0 :                         val &= ~DMA_RWCTRL_CRDRDR_RDMA_MRRS_MSK;
   10050         [ #  # ]:          0 :                 if (!tg3_flag(tp, 57765_CLASS) &&
   10051   [ #  #  #  # ]:          0 :                     tg3_asic_rev(tp) != ASIC_REV_5717 &&
   10052                 :            :                     tg3_asic_rev(tp) != ASIC_REV_5762)
   10053                 :          0 :                         val |= DMA_RWCTRL_TAGGED_STAT_WA;
   10054                 :          0 :                 tw32(TG3PCI_DMA_RW_CTRL, val | tp->dma_rwctrl);
   10055         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) != ASIC_REV_5784 &&
   10056                 :            :                    tg3_asic_rev(tp) != ASIC_REV_5761) {
   10057                 :            :                 /* This value is determined during the probe time DMA
   10058                 :            :                  * engine test, tg3_test_dma.
   10059                 :            :                  */
   10060                 :          0 :                 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
   10061                 :            :         }
   10062                 :            : 
   10063                 :          0 :         tp->grc_mode &= ~(GRC_MODE_HOST_SENDBDS |
   10064                 :            :                           GRC_MODE_4X_NIC_SEND_RINGS |
   10065                 :            :                           GRC_MODE_NO_TX_PHDR_CSUM |
   10066                 :            :                           GRC_MODE_NO_RX_PHDR_CSUM);
   10067                 :          0 :         tp->grc_mode |= GRC_MODE_HOST_SENDBDS;
   10068                 :            : 
   10069                 :            :         /* Pseudo-header checksum is done by hardware logic and not
   10070                 :            :          * the offload processers, so make the chip do the pseudo-
   10071                 :            :          * header checksums on receive.  For transmit it is more
   10072                 :            :          * convenient to do the pseudo-header checksum in software
   10073                 :            :          * as Linux does that on transmit for us in all cases.
   10074                 :            :          */
   10075                 :          0 :         tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
   10076                 :            : 
   10077                 :          0 :         val = GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP;
   10078         [ #  # ]:          0 :         if (tp->rxptpctl)
   10079                 :          0 :                 tw32(TG3_RX_PTP_CTL,
   10080                 :            :                      tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK);
   10081                 :            : 
   10082         [ #  # ]:          0 :         if (tg3_flag(tp, PTP_CAPABLE))
   10083                 :          0 :                 val |= GRC_MODE_TIME_SYNC_ENABLE;
   10084                 :            : 
   10085                 :          0 :         tw32(GRC_MODE, tp->grc_mode | val);
   10086                 :            : 
   10087                 :            :         /* On one of the AMD platform, MRRS is restricted to 4000 because of
   10088                 :            :          * south bridge limitation. As a workaround, Driver is setting MRRS
   10089                 :            :          * to 2048 instead of default 4096.
   10090                 :            :          */
   10091         [ #  # ]:          0 :         if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
   10092                 :            :             tp->pdev->subsystem_device == TG3PCI_SUBDEVICE_ID_DELL_5762) {
   10093                 :          0 :                 val = tr32(TG3PCI_DEV_STATUS_CTRL) & ~MAX_READ_REQ_MASK;
   10094                 :          0 :                 tw32(TG3PCI_DEV_STATUS_CTRL, val | MAX_READ_REQ_SIZE_2048);
   10095                 :            :         }
   10096                 :            : 
   10097                 :            :         /* Setup the timer prescalar register.  Clock is always 66Mhz. */
   10098                 :          0 :         val = tr32(GRC_MISC_CFG);
   10099                 :          0 :         val &= ~0xff;
   10100                 :          0 :         val |= (65 << GRC_MISC_CFG_PRESCALAR_SHIFT);
   10101                 :          0 :         tw32(GRC_MISC_CFG, val);
   10102                 :            : 
   10103                 :            :         /* Initialize MBUF/DESC pool. */
   10104         [ #  # ]:          0 :         if (tg3_flag(tp, 5750_PLUS)) {
   10105                 :            :                 /* Do nothing.  */
   10106         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) != ASIC_REV_5705) {
   10107                 :          0 :                 tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE);
   10108         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5704)
   10109                 :          0 :                         tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64);
   10110                 :            :                 else
   10111                 :          0 :                         tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96);
   10112                 :          0 :                 tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE);
   10113                 :          0 :                 tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE);
   10114         [ #  # ]:          0 :         } else if (tg3_flag(tp, TSO_CAPABLE)) {
   10115                 :          0 :                 int fw_len;
   10116                 :            : 
   10117                 :          0 :                 fw_len = tp->fw_len;
   10118                 :          0 :                 fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1);
   10119                 :          0 :                 tw32(BUFMGR_MB_POOL_ADDR,
   10120                 :            :                      NIC_SRAM_MBUF_POOL_BASE5705 + fw_len);
   10121                 :          0 :                 tw32(BUFMGR_MB_POOL_SIZE,
   10122                 :            :                      NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00);
   10123                 :            :         }
   10124                 :            : 
   10125         [ #  # ]:          0 :         if (tp->dev->mtu <= ETH_DATA_LEN) {
   10126                 :          0 :                 tw32(BUFMGR_MB_RDMA_LOW_WATER,
   10127                 :            :                      tp->bufmgr_config.mbuf_read_dma_low_water);
   10128                 :          0 :                 tw32(BUFMGR_MB_MACRX_LOW_WATER,
   10129                 :            :                      tp->bufmgr_config.mbuf_mac_rx_low_water);
   10130                 :          0 :                 tw32(BUFMGR_MB_HIGH_WATER,
   10131                 :            :                      tp->bufmgr_config.mbuf_high_water);
   10132                 :            :         } else {
   10133                 :          0 :                 tw32(BUFMGR_MB_RDMA_LOW_WATER,
   10134                 :            :                      tp->bufmgr_config.mbuf_read_dma_low_water_jumbo);
   10135                 :          0 :                 tw32(BUFMGR_MB_MACRX_LOW_WATER,
   10136                 :            :                      tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo);
   10137                 :          0 :                 tw32(BUFMGR_MB_HIGH_WATER,
   10138                 :            :                      tp->bufmgr_config.mbuf_high_water_jumbo);
   10139                 :            :         }
   10140                 :          0 :         tw32(BUFMGR_DMA_LOW_WATER,
   10141                 :            :              tp->bufmgr_config.dma_low_water);
   10142                 :          0 :         tw32(BUFMGR_DMA_HIGH_WATER,
   10143                 :            :              tp->bufmgr_config.dma_high_water);
   10144                 :            : 
   10145                 :          0 :         val = BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE;
   10146         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5719)
   10147                 :          0 :                 val |= BUFMGR_MODE_NO_TX_UNDERRUN;
   10148         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   10149         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5762 ||
   10150         [ #  # ]:          0 :             tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 ||
   10151                 :            :             tg3_chip_rev_id(tp) == CHIPREV_ID_5720_A0)
   10152                 :          0 :                 val |= BUFMGR_MODE_MBLOW_ATTN_ENAB;
   10153                 :          0 :         tw32(BUFMGR_MODE, val);
   10154         [ #  # ]:          0 :         for (i = 0; i < 2000; i++) {
   10155         [ #  # ]:          0 :                 if (tr32(BUFMGR_MODE) & BUFMGR_MODE_ENABLE)
   10156                 :            :                         break;
   10157                 :          0 :                 udelay(10);
   10158                 :            :         }
   10159         [ #  # ]:          0 :         if (i >= 2000) {
   10160                 :          0 :                 netdev_err(tp->dev, "%s cannot enable BUFMGR\n", __func__);
   10161                 :          0 :                 return -ENODEV;
   10162                 :            :         }
   10163                 :            : 
   10164         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5906_A1)
   10165                 :          0 :                 tw32(ISO_PKT_TX, (tr32(ISO_PKT_TX) & ~0x3) | 0x2);
   10166                 :            : 
   10167                 :          0 :         tg3_setup_rxbd_thresholds(tp);
   10168                 :            : 
   10169                 :            :         /* Initialize TG3_BDINFO's at:
   10170                 :            :          *  RCVDBDI_STD_BD:     standard eth size rx ring
   10171                 :            :          *  RCVDBDI_JUMBO_BD:   jumbo frame rx ring
   10172                 :            :          *  RCVDBDI_MINI_BD:    small frame rx ring (??? does not work)
   10173                 :            :          *
   10174                 :            :          * like so:
   10175                 :            :          *  TG3_BDINFO_HOST_ADDR:       high/low parts of DMA address of ring
   10176                 :            :          *  TG3_BDINFO_MAXLEN_FLAGS:    (rx max buffer size << 16) |
   10177                 :            :          *                              ring attribute flags
   10178                 :            :          *  TG3_BDINFO_NIC_ADDR:        location of descriptors in nic SRAM
   10179                 :            :          *
   10180                 :            :          * Standard receive ring @ NIC_SRAM_RX_BUFFER_DESC, 512 entries.
   10181                 :            :          * Jumbo receive ring @ NIC_SRAM_RX_JUMBO_BUFFER_DESC, 256 entries.
   10182                 :            :          *
   10183                 :            :          * The size of each ring is fixed in the firmware, but the location is
   10184                 :            :          * configurable.
   10185                 :            :          */
   10186                 :          0 :         tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
   10187                 :            :              ((u64) tpr->rx_std_mapping >> 32));
   10188                 :          0 :         tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
   10189                 :            :              ((u64) tpr->rx_std_mapping & 0xffffffff));
   10190         [ #  # ]:          0 :         if (!tg3_flag(tp, 5717_PLUS))
   10191                 :          0 :                 tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
   10192                 :            :                      NIC_SRAM_RX_BUFFER_DESC);
   10193                 :            : 
   10194                 :            :         /* Disable the mini ring */
   10195         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS))
   10196                 :          0 :                 tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS,
   10197                 :            :                      BDINFO_FLAGS_DISABLED);
   10198                 :            : 
   10199                 :            :         /* Program the jumbo buffer descriptor ring control
   10200                 :            :          * blocks on those devices that have them.
   10201                 :            :          */
   10202   [ #  #  #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 ||
   10203         [ #  # ]:          0 :             (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS))) {
   10204                 :            : 
   10205         [ #  # ]:          0 :                 if (tg3_flag(tp, JUMBO_RING_ENABLE)) {
   10206                 :          0 :                         tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
   10207                 :            :                              ((u64) tpr->rx_jmb_mapping >> 32));
   10208                 :          0 :                         tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
   10209                 :            :                              ((u64) tpr->rx_jmb_mapping & 0xffffffff));
   10210         [ #  # ]:          0 :                         val = TG3_RX_JMB_RING_SIZE(tp) <<
   10211                 :            :                               BDINFO_FLAGS_MAXLEN_SHIFT;
   10212                 :          0 :                         tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
   10213                 :            :                              val | BDINFO_FLAGS_USE_EXT_RECV);
   10214   [ #  #  #  # ]:          0 :                         if (!tg3_flag(tp, USE_JUMBO_BDFLAG) ||
   10215                 :          0 :                             tg3_flag(tp, 57765_CLASS) ||
   10216         [ #  # ]:          0 :                             tg3_asic_rev(tp) == ASIC_REV_5762)
   10217                 :          0 :                                 tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
   10218                 :            :                                      NIC_SRAM_RX_JUMBO_BUFFER_DESC);
   10219                 :            :                 } else {
   10220                 :          0 :                         tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
   10221                 :            :                              BDINFO_FLAGS_DISABLED);
   10222                 :            :                 }
   10223                 :            : 
   10224         [ #  # ]:          0 :                 if (tg3_flag(tp, 57765_PLUS)) {
   10225         [ #  # ]:          0 :                         val = TG3_RX_STD_RING_SIZE(tp);
   10226                 :          0 :                         val <<= BDINFO_FLAGS_MAXLEN_SHIFT;
   10227                 :          0 :                         val |= (TG3_RX_STD_DMA_SZ << 2);
   10228                 :            :                 } else
   10229                 :            :                         val = TG3_RX_STD_DMA_SZ << BDINFO_FLAGS_MAXLEN_SHIFT;
   10230                 :            :         } else
   10231                 :            :                 val = TG3_RX_STD_MAX_SIZE_5700 << BDINFO_FLAGS_MAXLEN_SHIFT;
   10232                 :            : 
   10233                 :          0 :         tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, val);
   10234                 :            : 
   10235                 :          0 :         tpr->rx_std_prod_idx = tp->rx_pending;
   10236                 :          0 :         tw32_rx_mbox(TG3_RX_STD_PROD_IDX_REG, tpr->rx_std_prod_idx);
   10237                 :            : 
   10238                 :          0 :         tpr->rx_jmb_prod_idx =
   10239         [ #  # ]:          0 :                 tg3_flag(tp, JUMBO_RING_ENABLE) ? tp->rx_jumbo_pending : 0;
   10240                 :          0 :         tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, tpr->rx_jmb_prod_idx);
   10241                 :            : 
   10242                 :          0 :         tg3_rings_reset(tp);
   10243                 :            : 
   10244                 :            :         /* Initialize MAC address and backoff seed. */
   10245                 :          0 :         __tg3_set_mac_addr(tp, false);
   10246                 :            : 
   10247                 :            :         /* MTU + ethernet header + FCS + optional VLAN tag */
   10248                 :          0 :         tw32(MAC_RX_MTU_SIZE,
   10249                 :            :              tp->dev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN);
   10250                 :            : 
   10251                 :            :         /* The slot time is changed by tg3_setup_phy if we
   10252                 :            :          * run at gigabit with half duplex.
   10253                 :            :          */
   10254                 :          0 :         val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
   10255                 :            :               (6 << TX_LENGTHS_IPG_SHIFT) |
   10256                 :            :               (32 << TX_LENGTHS_SLOT_TIME_SHIFT);
   10257                 :            : 
   10258         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5720 ||
   10259                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762)
   10260                 :          0 :                 val |= tr32(MAC_TX_LENGTHS) &
   10261                 :            :                        (TX_LENGTHS_JMB_FRM_LEN_MSK |
   10262                 :            :                         TX_LENGTHS_CNT_DWN_VAL_MSK);
   10263                 :            : 
   10264                 :          0 :         tw32(MAC_TX_LENGTHS, val);
   10265                 :            : 
   10266                 :            :         /* Receive rules. */
   10267                 :          0 :         tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS);
   10268                 :          0 :         tw32(RCVLPC_CONFIG, 0x0181);
   10269                 :            : 
   10270                 :            :         /* Calculate RDMAC_MODE setting early, we need it to determine
   10271                 :            :          * the RCVLPC_STATE_ENABLE mask.
   10272                 :            :          */
   10273                 :          0 :         rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB |
   10274                 :            :                       RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB |
   10275                 :            :                       RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB |
   10276                 :            :                       RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB |
   10277                 :            :                       RDMAC_MODE_LNGREAD_ENAB);
   10278                 :            : 
   10279         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717)
   10280                 :          0 :                 rdmac_mode |= RDMAC_MODE_MULT_DMA_RD_DIS;
   10281                 :            : 
   10282                 :          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5784 ||
   10283         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5785 ||
   10284                 :            :             tg3_asic_rev(tp) == ASIC_REV_57780)
   10285                 :          0 :                 rdmac_mode |= RDMAC_MODE_BD_SBD_CRPT_ENAB |
   10286                 :            :                               RDMAC_MODE_MBUF_RBD_CRPT_ENAB |
   10287                 :            :                               RDMAC_MODE_MBUF_SBD_CRPT_ENAB;
   10288                 :            : 
   10289   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5705 &&
   10290                 :            :             tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) {
   10291         [ #  # ]:          0 :                 if (tg3_flag(tp, TSO_CAPABLE) &&
   10292         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5705) {
   10293                 :          0 :                         rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128;
   10294   [ #  #  #  # ]:          0 :                 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
   10295                 :            :                            !tg3_flag(tp, IS_5788)) {
   10296                 :          0 :                         rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
   10297                 :            :                 }
   10298                 :            :         }
   10299                 :            : 
   10300         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS))
   10301                 :          0 :                 rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
   10302                 :            : 
   10303         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57766) {
   10304                 :          0 :                 tp->dma_limit = 0;
   10305         [ #  # ]:          0 :                 if (tp->dev->mtu <= ETH_DATA_LEN) {
   10306                 :          0 :                         rdmac_mode |= RDMAC_MODE_JMB_2K_MMRR;
   10307                 :          0 :                         tp->dma_limit = TG3_TX_BD_DMA_MAX_2K;
   10308                 :            :                 }
   10309                 :            :         }
   10310                 :            : 
   10311   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, HW_TSO_1) ||
   10312         [ #  # ]:          0 :             tg3_flag(tp, HW_TSO_2) ||
   10313                 :            :             tg3_flag(tp, HW_TSO_3))
   10314                 :          0 :                 rdmac_mode |= RDMAC_MODE_IPV4_LSO_EN;
   10315                 :            : 
   10316         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS) ||
   10317   [ #  #  #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5785 ||
   10318                 :            :             tg3_asic_rev(tp) == ASIC_REV_57780)
   10319                 :          0 :                 rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN;
   10320                 :            : 
   10321         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5720 ||
   10322                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762)
   10323                 :          0 :                 rdmac_mode |= tr32(RDMAC_MODE) & RDMAC_MODE_H2BNC_VLAN_DET;
   10324                 :            : 
   10325         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5761 ||
   10326         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5784 ||
   10327         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5785 ||
   10328         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_57780 ||
   10329                 :            :             tg3_flag(tp, 57765_PLUS)) {
   10330                 :          0 :                 u32 tgtreg;
   10331                 :            : 
   10332         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5762)
   10333                 :            :                         tgtreg = TG3_RDMA_RSRVCTRL_REG2;
   10334                 :            :                 else
   10335                 :          0 :                         tgtreg = TG3_RDMA_RSRVCTRL_REG;
   10336                 :            : 
   10337                 :          0 :                 val = tr32(tgtreg);
   10338         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 ||
   10339         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5762) {
   10340                 :          0 :                         val &= ~(TG3_RDMA_RSRVCTRL_TXMRGN_MASK |
   10341                 :            :                                  TG3_RDMA_RSRVCTRL_FIFO_LWM_MASK |
   10342                 :            :                                  TG3_RDMA_RSRVCTRL_FIFO_HWM_MASK);
   10343                 :          0 :                         val |= TG3_RDMA_RSRVCTRL_TXMRGN_320B |
   10344                 :            :                                TG3_RDMA_RSRVCTRL_FIFO_LWM_1_5K |
   10345                 :            :                                TG3_RDMA_RSRVCTRL_FIFO_HWM_1_5K;
   10346                 :            :                 }
   10347                 :          0 :                 tw32(tgtreg, val | TG3_RDMA_RSRVCTRL_FIFO_OFLW_FIX);
   10348                 :            :         }
   10349                 :            : 
   10350         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5719 ||
   10351         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5720 ||
   10352                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762) {
   10353                 :          0 :                 u32 tgtreg;
   10354                 :            : 
   10355         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5762)
   10356                 :            :                         tgtreg = TG3_LSO_RD_DMA_CRPTEN_CTRL2;
   10357                 :            :                 else
   10358                 :          0 :                         tgtreg = TG3_LSO_RD_DMA_CRPTEN_CTRL;
   10359                 :            : 
   10360                 :          0 :                 val = tr32(tgtreg);
   10361                 :          0 :                 tw32(tgtreg, val |
   10362                 :            :                      TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K |
   10363                 :            :                      TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K);
   10364                 :            :         }
   10365                 :            : 
   10366                 :            :         /* Receive/send statistics. */
   10367         [ #  # ]:          0 :         if (tg3_flag(tp, 5750_PLUS)) {
   10368                 :          0 :                 val = tr32(RCVLPC_STATS_ENABLE);
   10369                 :          0 :                 val &= ~RCVLPC_STATSENAB_DACK_FIX;
   10370                 :          0 :                 tw32(RCVLPC_STATS_ENABLE, val);
   10371   [ #  #  #  # ]:          0 :         } else if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) &&
   10372                 :            :                    tg3_flag(tp, TSO_CAPABLE)) {
   10373                 :          0 :                 val = tr32(RCVLPC_STATS_ENABLE);
   10374                 :          0 :                 val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX;
   10375                 :          0 :                 tw32(RCVLPC_STATS_ENABLE, val);
   10376                 :            :         } else {
   10377                 :          0 :                 tw32(RCVLPC_STATS_ENABLE, 0xffffff);
   10378                 :            :         }
   10379                 :          0 :         tw32(RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE);
   10380                 :          0 :         tw32(SNDDATAI_STATSENAB, 0xffffff);
   10381                 :          0 :         tw32(SNDDATAI_STATSCTRL,
   10382                 :            :              (SNDDATAI_SCTRL_ENABLE |
   10383                 :            :               SNDDATAI_SCTRL_FASTUPD));
   10384                 :            : 
   10385                 :            :         /* Setup host coalescing engine. */
   10386                 :          0 :         tw32(HOSTCC_MODE, 0);
   10387         [ #  # ]:          0 :         for (i = 0; i < 2000; i++) {
   10388         [ #  # ]:          0 :                 if (!(tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE))
   10389                 :            :                         break;
   10390                 :          0 :                 udelay(10);
   10391                 :            :         }
   10392                 :            : 
   10393                 :          0 :         __tg3_set_coalesce(tp, &tp->coal);
   10394                 :            : 
   10395         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
   10396                 :            :                 /* Status/statistics block address.  See tg3_timer,
   10397                 :            :                  * the tg3_periodic_fetch_stats call there, and
   10398                 :            :                  * tg3_get_stats to see how this works for 5705/5750 chips.
   10399                 :            :                  */
   10400                 :          0 :                 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
   10401                 :            :                      ((u64) tp->stats_mapping >> 32));
   10402                 :          0 :                 tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
   10403                 :            :                      ((u64) tp->stats_mapping & 0xffffffff));
   10404                 :          0 :                 tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK);
   10405                 :            : 
   10406                 :          0 :                 tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK);
   10407                 :            : 
   10408                 :            :                 /* Clear statistics and status block memory areas */
   10409                 :          0 :                 for (i = NIC_SRAM_STATS_BLK;
   10410         [ #  # ]:          0 :                      i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
   10411                 :          0 :                      i += sizeof(u32)) {
   10412                 :          0 :                         tg3_write_mem(tp, i, 0);
   10413                 :          0 :                         udelay(40);
   10414                 :            :                 }
   10415                 :            :         }
   10416                 :            : 
   10417                 :          0 :         tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode);
   10418                 :            : 
   10419                 :          0 :         tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE);
   10420                 :          0 :         tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE);
   10421         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS))
   10422                 :          0 :                 tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE);
   10423                 :            : 
   10424         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_MII_SERDES) {
   10425                 :          0 :                 tp->phy_flags &= ~TG3_PHYFLG_PARALLEL_DETECT;
   10426                 :            :                 /* reset to prevent losing 1st rx packet intermittently */
   10427                 :          0 :                 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
   10428                 :          0 :                 udelay(10);
   10429                 :            :         }
   10430                 :            : 
   10431                 :          0 :         tp->mac_mode |= MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE |
   10432                 :            :                         MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE |
   10433                 :            :                         MAC_MODE_FHDE_ENABLE;
   10434         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE))
   10435                 :          0 :                 tp->mac_mode |= MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN;
   10436         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS) &&
   10437         [ #  # ]:          0 :             !(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) &&
   10438         [ #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5700)
   10439                 :          0 :                 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
   10440                 :          0 :         tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR);
   10441                 :          0 :         udelay(40);
   10442                 :            : 
   10443                 :            :         /* tp->grc_local_ctrl is partially set up during tg3_get_invariants().
   10444                 :            :          * If TG3_FLAG_IS_NIC is zero, we should read the
   10445                 :            :          * register to preserve the GPIO settings for LOMs. The GPIOs,
   10446                 :            :          * whether used as inputs or outputs, are set by boot code after
   10447                 :            :          * reset.
   10448                 :            :          */
   10449         [ #  # ]:          0 :         if (!tg3_flag(tp, IS_NIC)) {
   10450                 :          0 :                 u32 gpio_mask;
   10451                 :            : 
   10452                 :          0 :                 gpio_mask = GRC_LCLCTRL_GPIO_OE0 | GRC_LCLCTRL_GPIO_OE1 |
   10453                 :            :                             GRC_LCLCTRL_GPIO_OE2 | GRC_LCLCTRL_GPIO_OUTPUT0 |
   10454                 :            :                             GRC_LCLCTRL_GPIO_OUTPUT1 | GRC_LCLCTRL_GPIO_OUTPUT2;
   10455                 :            : 
   10456         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5752)
   10457                 :          0 :                         gpio_mask |= GRC_LCLCTRL_GPIO_OE3 |
   10458                 :            :                                      GRC_LCLCTRL_GPIO_OUTPUT3;
   10459                 :            : 
   10460         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5755)
   10461                 :          0 :                         gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL;
   10462                 :            : 
   10463                 :          0 :                 tp->grc_local_ctrl &= ~gpio_mask;
   10464                 :          0 :                 tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask;
   10465                 :            : 
   10466                 :            :                 /* GPIO1 must be driven high for eeprom write protect */
   10467         [ #  # ]:          0 :                 if (tg3_flag(tp, EEPROM_WRITE_PROT))
   10468                 :          0 :                         tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
   10469                 :            :                                                GRC_LCLCTRL_GPIO_OUTPUT1);
   10470                 :            :         }
   10471                 :          0 :         tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
   10472                 :          0 :         udelay(100);
   10473                 :            : 
   10474         [ #  # ]:          0 :         if (tg3_flag(tp, USING_MSIX)) {
   10475                 :          0 :                 val = tr32(MSGINT_MODE);
   10476                 :          0 :                 val |= MSGINT_MODE_ENABLE;
   10477         [ #  # ]:          0 :                 if (tp->irq_cnt > 1)
   10478                 :          0 :                         val |= MSGINT_MODE_MULTIVEC_EN;
   10479         [ #  # ]:          0 :                 if (!tg3_flag(tp, 1SHOT_MSI))
   10480                 :          0 :                         val |= MSGINT_MODE_ONE_SHOT_DISABLE;
   10481                 :          0 :                 tw32(MSGINT_MODE, val);
   10482                 :            :         }
   10483                 :            : 
   10484         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
   10485                 :          0 :                 tw32_f(DMAC_MODE, DMAC_MODE_ENABLE);
   10486                 :          0 :                 udelay(40);
   10487                 :            :         }
   10488                 :            : 
   10489                 :          0 :         val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB |
   10490                 :            :                WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB |
   10491                 :            :                WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB |
   10492                 :            :                WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB |
   10493                 :            :                WDMAC_MODE_LNGREAD_ENAB);
   10494                 :            : 
   10495   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5705 &&
   10496                 :            :             tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) {
   10497         [ #  # ]:          0 :                 if (tg3_flag(tp, TSO_CAPABLE) &&
   10498         [ #  # ]:          0 :                     (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A1 ||
   10499                 :            :                      tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A2)) {
   10500                 :            :                         /* nothing */
   10501   [ #  #  #  # ]:          0 :                 } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
   10502                 :            :                            !tg3_flag(tp, IS_5788)) {
   10503                 :          0 :                         val |= WDMAC_MODE_RX_ACCEL;
   10504                 :            :                 }
   10505                 :            :         }
   10506                 :            : 
   10507                 :            :         /* Enable host coalescing bug fix */
   10508         [ #  # ]:          0 :         if (tg3_flag(tp, 5755_PLUS))
   10509                 :          0 :                 val |= WDMAC_MODE_STATUS_TAG_FIX;
   10510                 :            : 
   10511         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5785)
   10512                 :          0 :                 val |= WDMAC_MODE_BURST_ALL_DATA;
   10513                 :            : 
   10514                 :          0 :         tw32_f(WDMAC_MODE, val);
   10515                 :          0 :         udelay(40);
   10516                 :            : 
   10517         [ #  # ]:          0 :         if (tg3_flag(tp, PCIX_MODE)) {
   10518                 :          0 :                 u16 pcix_cmd;
   10519                 :            : 
   10520                 :          0 :                 pci_read_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
   10521                 :            :                                      &pcix_cmd);
   10522         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5703) {
   10523                 :          0 :                         pcix_cmd &= ~PCI_X_CMD_MAX_READ;
   10524                 :          0 :                         pcix_cmd |= PCI_X_CMD_READ_2K;
   10525         [ #  # ]:          0 :                 } else if (tg3_asic_rev(tp) == ASIC_REV_5704) {
   10526                 :          0 :                         pcix_cmd &= ~(PCI_X_CMD_MAX_SPLIT | PCI_X_CMD_MAX_READ);
   10527                 :          0 :                         pcix_cmd |= PCI_X_CMD_READ_2K;
   10528                 :            :                 }
   10529                 :          0 :                 pci_write_config_word(tp->pdev, tp->pcix_cap + PCI_X_CMD,
   10530                 :            :                                       pcix_cmd);
   10531                 :            :         }
   10532                 :            : 
   10533                 :          0 :         tw32_f(RDMAC_MODE, rdmac_mode);
   10534                 :          0 :         udelay(40);
   10535                 :            : 
   10536         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5719 ||
   10537                 :            :             tg3_asic_rev(tp) == ASIC_REV_5720) {
   10538         [ #  # ]:          0 :                 for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) {
   10539   [ #  #  #  # ]:          0 :                         if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp))
   10540                 :            :                                 break;
   10541                 :            :                 }
   10542         [ #  # ]:          0 :                 if (i < TG3_NUM_RDMA_CHANNELS) {
   10543                 :          0 :                         val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL);
   10544         [ #  # ]:          0 :                         val |= tg3_lso_rd_dma_workaround_bit(tp);
   10545                 :          0 :                         tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val);
   10546                 :          0 :                         tg3_flag_set(tp, 5719_5720_RDMA_BUG);
   10547                 :            :                 }
   10548                 :            :         }
   10549                 :            : 
   10550                 :          0 :         tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE);
   10551         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS))
   10552                 :          0 :                 tw32(MBFREE_MODE, MBFREE_MODE_ENABLE);
   10553                 :            : 
   10554         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5761)
   10555                 :          0 :                 tw32(SNDDATAC_MODE,
   10556                 :            :                      SNDDATAC_MODE_ENABLE | SNDDATAC_MODE_CDELAY);
   10557                 :            :         else
   10558                 :          0 :                 tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
   10559                 :            : 
   10560                 :          0 :         tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE);
   10561                 :          0 :         tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB);
   10562                 :          0 :         val = RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ;
   10563         [ #  # ]:          0 :         if (tg3_flag(tp, LRG_PROD_RING_CAP))
   10564                 :          0 :                 val |= RCVDBDI_MODE_LRG_RING_SZ;
   10565                 :          0 :         tw32(RCVDBDI_MODE, val);
   10566                 :          0 :         tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
   10567   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, HW_TSO_1) ||
   10568         [ #  # ]:          0 :             tg3_flag(tp, HW_TSO_2) ||
   10569                 :            :             tg3_flag(tp, HW_TSO_3))
   10570                 :          0 :                 tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
   10571                 :          0 :         val = SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE;
   10572         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_TSS))
   10573                 :          0 :                 val |= SNDBDI_MODE_MULTI_TXQ_EN;
   10574                 :          0 :         tw32(SNDBDI_MODE, val);
   10575                 :          0 :         tw32(SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE);
   10576                 :            : 
   10577         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) {
   10578                 :          0 :                 err = tg3_load_5701_a0_firmware_fix(tp);
   10579         [ #  # ]:          0 :                 if (err)
   10580                 :            :                         return err;
   10581                 :            :         }
   10582                 :            : 
   10583         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57766) {
   10584                 :            :                 /* Ignore any errors for the firmware download. If download
   10585                 :            :                  * fails, the device will operate with EEE disabled
   10586                 :            :                  */
   10587                 :          0 :                 tg3_load_57766_firmware(tp);
   10588                 :            :         }
   10589                 :            : 
   10590         [ #  # ]:          0 :         if (tg3_flag(tp, TSO_CAPABLE)) {
   10591                 :          0 :                 err = tg3_load_tso_firmware(tp);
   10592         [ #  # ]:          0 :                 if (err)
   10593                 :            :                         return err;
   10594                 :            :         }
   10595                 :            : 
   10596                 :          0 :         tp->tx_mode = TX_MODE_ENABLE;
   10597                 :            : 
   10598         [ #  # ]:          0 :         if (tg3_flag(tp, 5755_PLUS) ||
   10599         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5906)
   10600                 :          0 :                 tp->tx_mode |= TX_MODE_MBUF_LOCKUP_FIX;
   10601                 :            : 
   10602         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5720 ||
   10603                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762) {
   10604                 :          0 :                 val = TX_MODE_JMB_FRM_LEN | TX_MODE_CNT_DN_MODE;
   10605                 :          0 :                 tp->tx_mode &= ~val;
   10606                 :          0 :                 tp->tx_mode |= tr32(MAC_TX_MODE) & val;
   10607                 :            :         }
   10608                 :            : 
   10609                 :          0 :         tw32_f(MAC_TX_MODE, tp->tx_mode);
   10610                 :          0 :         udelay(100);
   10611                 :            : 
   10612         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_RSS)) {
   10613                 :          0 :                 u32 rss_key[10];
   10614                 :            : 
   10615                 :          0 :                 tg3_rss_write_indir_tbl(tp);
   10616                 :            : 
   10617                 :          0 :                 netdev_rss_key_fill(rss_key, 10 * sizeof(u32));
   10618                 :            : 
   10619         [ #  # ]:          0 :                 for (i = 0; i < 10 ; i++)
   10620                 :          0 :                         tw32(MAC_RSS_HASH_KEY_0 + i*4, rss_key[i]);
   10621                 :            :         }
   10622                 :            : 
   10623                 :          0 :         tp->rx_mode = RX_MODE_ENABLE;
   10624         [ #  # ]:          0 :         if (tg3_flag(tp, 5755_PLUS))
   10625                 :          0 :                 tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE;
   10626                 :            : 
   10627         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5762)
   10628                 :          0 :                 tp->rx_mode |= RX_MODE_IPV4_FRAG_FIX;
   10629                 :            : 
   10630         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_RSS))
   10631                 :          0 :                 tp->rx_mode |= RX_MODE_RSS_ENABLE |
   10632                 :            :                                RX_MODE_RSS_ITBL_HASH_BITS_7 |
   10633                 :            :                                RX_MODE_RSS_IPV6_HASH_EN |
   10634                 :            :                                RX_MODE_RSS_TCP_IPV6_HASH_EN |
   10635                 :            :                                RX_MODE_RSS_IPV4_HASH_EN |
   10636                 :            :                                RX_MODE_RSS_TCP_IPV4_HASH_EN;
   10637                 :            : 
   10638                 :          0 :         tw32_f(MAC_RX_MODE, tp->rx_mode);
   10639                 :          0 :         udelay(10);
   10640                 :            : 
   10641                 :          0 :         tw32(MAC_LED_CTRL, tp->led_ctrl);
   10642                 :            : 
   10643                 :          0 :         tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
   10644         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) {
   10645                 :          0 :                 tw32_f(MAC_RX_MODE, RX_MODE_RESET);
   10646                 :          0 :                 udelay(10);
   10647                 :            :         }
   10648                 :          0 :         tw32_f(MAC_RX_MODE, tp->rx_mode);
   10649                 :          0 :         udelay(10);
   10650                 :            : 
   10651         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) {
   10652         [ #  # ]:          0 :                 if ((tg3_asic_rev(tp) == ASIC_REV_5704) &&
   10653         [ #  # ]:          0 :                     !(tp->phy_flags & TG3_PHYFLG_SERDES_PREEMPHASIS)) {
   10654                 :            :                         /* Set drive transmission level to 1.2V  */
   10655                 :            :                         /* only if the signal pre-emphasis bit is not set  */
   10656                 :          0 :                         val = tr32(MAC_SERDES_CFG);
   10657                 :          0 :                         val &= 0xfffff000;
   10658                 :          0 :                         val |= 0x880;
   10659                 :          0 :                         tw32(MAC_SERDES_CFG, val);
   10660                 :            :                 }
   10661         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5703_A1)
   10662                 :          0 :                         tw32(MAC_SERDES_CFG, 0x616000);
   10663                 :            :         }
   10664                 :            : 
   10665                 :            :         /* Prevent chip from dropping frames when flow control
   10666                 :            :          * is enabled.
   10667                 :            :          */
   10668         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_CLASS))
   10669                 :            :                 val = 1;
   10670                 :            :         else
   10671                 :          0 :                 val = 2;
   10672                 :          0 :         tw32_f(MAC_LOW_WMARK_MAX_RX_FRAME, val);
   10673                 :            : 
   10674         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5704 &&
   10675         [ #  # ]:          0 :             (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) {
   10676                 :            :                 /* Use hardware link auto-negotiation */
   10677                 :          0 :                 tg3_flag_set(tp, HW_AUTONEG);
   10678                 :            :         }
   10679                 :            : 
   10680         [ #  # ]:          0 :         if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) &&
   10681         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5714) {
   10682                 :          0 :                 u32 tmp;
   10683                 :            : 
   10684                 :          0 :                 tmp = tr32(SERDES_RX_CTRL);
   10685                 :          0 :                 tw32(SERDES_RX_CTRL, tmp | SERDES_RX_SIG_DETECT);
   10686                 :          0 :                 tp->grc_local_ctrl &= ~GRC_LCLCTRL_USE_EXT_SIG_DETECT;
   10687                 :          0 :                 tp->grc_local_ctrl |= GRC_LCLCTRL_USE_SIG_DETECT;
   10688                 :          0 :                 tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
   10689                 :            :         }
   10690                 :            : 
   10691         [ #  # ]:          0 :         if (!tg3_flag(tp, USE_PHYLIB)) {
   10692         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
   10693                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_IS_LOW_POWER;
   10694                 :            : 
   10695                 :          0 :                 err = tg3_setup_phy(tp, false);
   10696         [ #  # ]:          0 :                 if (err)
   10697                 :            :                         return err;
   10698                 :            : 
   10699         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) &&
   10700                 :            :                     !(tp->phy_flags & TG3_PHYFLG_IS_FET)) {
   10701                 :          0 :                         u32 tmp;
   10702                 :            : 
   10703                 :            :                         /* Clear CRC stats. */
   10704         [ #  # ]:          0 :                         if (!tg3_readphy(tp, MII_TG3_TEST1, &tmp)) {
   10705                 :          0 :                                 tg3_writephy(tp, MII_TG3_TEST1,
   10706                 :            :                                              tmp | MII_TG3_TEST1_CRC_EN);
   10707                 :          0 :                                 tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &tmp);
   10708                 :            :                         }
   10709                 :            :                 }
   10710                 :            :         }
   10711                 :            : 
   10712                 :          0 :         __tg3_set_rx_mode(tp->dev);
   10713                 :            : 
   10714                 :            :         /* Initialize receive rules. */
   10715                 :          0 :         tw32(MAC_RCV_RULE_0,  0xc2000000 & RCV_RULE_DISABLE_MASK);
   10716                 :          0 :         tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK);
   10717                 :          0 :         tw32(MAC_RCV_RULE_1,  0x86000004 & RCV_RULE_DISABLE_MASK);
   10718                 :          0 :         tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK);
   10719                 :            : 
   10720   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS) && !tg3_flag(tp, 5780_CLASS))
   10721                 :            :                 limit = 8;
   10722                 :            :         else
   10723                 :            :                 limit = 16;
   10724         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF))
   10725                 :          0 :                 limit -= 4;
   10726   [ #  #  #  #  :          0 :         switch (limit) {
          #  #  #  #  #  
             #  #  #  # ]
   10727                 :          0 :         case 16:
   10728                 :          0 :                 tw32(MAC_RCV_RULE_15,  0); tw32(MAC_RCV_VALUE_15,  0);
   10729                 :            :                 /* fall through */
   10730                 :          0 :         case 15:
   10731                 :          0 :                 tw32(MAC_RCV_RULE_14,  0); tw32(MAC_RCV_VALUE_14,  0);
   10732                 :            :                 /* fall through */
   10733                 :          0 :         case 14:
   10734                 :          0 :                 tw32(MAC_RCV_RULE_13,  0); tw32(MAC_RCV_VALUE_13,  0);
   10735                 :            :                 /* fall through */
   10736                 :          0 :         case 13:
   10737                 :          0 :                 tw32(MAC_RCV_RULE_12,  0); tw32(MAC_RCV_VALUE_12,  0);
   10738                 :            :                 /* fall through */
   10739                 :          0 :         case 12:
   10740                 :          0 :                 tw32(MAC_RCV_RULE_11,  0); tw32(MAC_RCV_VALUE_11,  0);
   10741                 :            :                 /* fall through */
   10742                 :          0 :         case 11:
   10743                 :          0 :                 tw32(MAC_RCV_RULE_10,  0); tw32(MAC_RCV_VALUE_10,  0);
   10744                 :            :                 /* fall through */
   10745                 :          0 :         case 10:
   10746                 :          0 :                 tw32(MAC_RCV_RULE_9,  0); tw32(MAC_RCV_VALUE_9,  0);
   10747                 :            :                 /* fall through */
   10748                 :          0 :         case 9:
   10749                 :          0 :                 tw32(MAC_RCV_RULE_8,  0); tw32(MAC_RCV_VALUE_8,  0);
   10750                 :            :                 /* fall through */
   10751                 :          0 :         case 8:
   10752                 :          0 :                 tw32(MAC_RCV_RULE_7,  0); tw32(MAC_RCV_VALUE_7,  0);
   10753                 :            :                 /* fall through */
   10754                 :          0 :         case 7:
   10755                 :          0 :                 tw32(MAC_RCV_RULE_6,  0); tw32(MAC_RCV_VALUE_6,  0);
   10756                 :            :                 /* fall through */
   10757                 :          0 :         case 6:
   10758                 :          0 :                 tw32(MAC_RCV_RULE_5,  0); tw32(MAC_RCV_VALUE_5,  0);
   10759                 :            :                 /* fall through */
   10760                 :          0 :         case 5:
   10761                 :          0 :                 tw32(MAC_RCV_RULE_4,  0); tw32(MAC_RCV_VALUE_4,  0);
   10762                 :            :                 /* fall through */
   10763                 :            :         case 4:
   10764                 :            :                 /* tw32(MAC_RCV_RULE_3,  0); tw32(MAC_RCV_VALUE_3,  0); */
   10765                 :            :         case 3:
   10766                 :            :                 /* tw32(MAC_RCV_RULE_2,  0); tw32(MAC_RCV_VALUE_2,  0); */
   10767                 :            :         case 2:
   10768                 :            :         case 1:
   10769                 :            : 
   10770                 :            :         default:
   10771                 :          0 :                 break;
   10772                 :            :         }
   10773                 :            : 
   10774         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE))
   10775                 :            :                 /* Write our heartbeat update interval to APE. */
   10776                 :          0 :                 tg3_ape_write32(tp, TG3_APE_HOST_HEARTBEAT_INT_MS,
   10777                 :            :                                 APE_HOST_HEARTBEAT_INT_5SEC);
   10778                 :            : 
   10779                 :          0 :         tg3_write_sig_post_reset(tp, RESET_KIND_INIT);
   10780                 :            : 
   10781                 :          0 :         return 0;
   10782                 :            : }
   10783                 :            : 
   10784                 :            : /* Called at device open time to get the chip ready for
   10785                 :            :  * packet processing.  Invoked with tp->lock held.
   10786                 :            :  */
   10787                 :          0 : static int tg3_init_hw(struct tg3 *tp, bool reset_phy)
   10788                 :            : {
   10789                 :            :         /* Chip may have been just powered on. If so, the boot code may still
   10790                 :            :          * be running initialization. Wait for it to finish to avoid races in
   10791                 :            :          * accessing the hardware.
   10792                 :            :          */
   10793                 :          0 :         tg3_enable_register_access(tp);
   10794                 :          0 :         tg3_poll_fw(tp);
   10795                 :            : 
   10796                 :          0 :         tg3_switch_clocks(tp);
   10797                 :            : 
   10798                 :          0 :         tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
   10799                 :            : 
   10800                 :          0 :         return tg3_reset_hw(tp, reset_phy);
   10801                 :            : }
   10802                 :            : 
   10803                 :            : #ifdef CONFIG_TIGON3_HWMON
   10804                 :          0 : static void tg3_sd_scan_scratchpad(struct tg3 *tp, struct tg3_ocir *ocir)
   10805                 :            : {
   10806                 :          0 :         int i;
   10807                 :            : 
   10808         [ #  # ]:          0 :         for (i = 0; i < TG3_SD_NUM_RECS; i++, ocir++) {
   10809                 :          0 :                 u32 off = i * TG3_OCIR_LEN, len = TG3_OCIR_LEN;
   10810                 :            : 
   10811                 :          0 :                 tg3_ape_scratchpad_read(tp, (u32 *) ocir, off, len);
   10812                 :          0 :                 off += len;
   10813                 :            : 
   10814         [ #  # ]:          0 :                 if (ocir->signature != TG3_OCIR_SIG_MAGIC ||
   10815         [ #  # ]:          0 :                     !(ocir->version_flags & TG3_OCIR_FLAG_ACTIVE))
   10816                 :          0 :                         memset(ocir, 0, TG3_OCIR_LEN);
   10817                 :            :         }
   10818                 :          0 : }
   10819                 :            : 
   10820                 :            : /* sysfs attributes for hwmon */
   10821                 :          0 : static ssize_t tg3_show_temp(struct device *dev,
   10822                 :            :                              struct device_attribute *devattr, char *buf)
   10823                 :            : {
   10824                 :          0 :         struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
   10825                 :          0 :         struct tg3 *tp = dev_get_drvdata(dev);
   10826                 :          0 :         u32 temperature;
   10827                 :            : 
   10828                 :          0 :         spin_lock_bh(&tp->lock);
   10829                 :          0 :         tg3_ape_scratchpad_read(tp, &temperature, attr->index,
   10830                 :            :                                 sizeof(temperature));
   10831                 :          0 :         spin_unlock_bh(&tp->lock);
   10832                 :          0 :         return sprintf(buf, "%u\n", temperature * 1000);
   10833                 :            : }
   10834                 :            : 
   10835                 :            : 
   10836                 :            : static SENSOR_DEVICE_ATTR(temp1_input, 0444, tg3_show_temp, NULL,
   10837                 :            :                           TG3_TEMP_SENSOR_OFFSET);
   10838                 :            : static SENSOR_DEVICE_ATTR(temp1_crit, 0444, tg3_show_temp, NULL,
   10839                 :            :                           TG3_TEMP_CAUTION_OFFSET);
   10840                 :            : static SENSOR_DEVICE_ATTR(temp1_max, 0444, tg3_show_temp, NULL,
   10841                 :            :                           TG3_TEMP_MAX_OFFSET);
   10842                 :            : 
   10843                 :            : static struct attribute *tg3_attrs[] = {
   10844                 :            :         &sensor_dev_attr_temp1_input.dev_attr.attr,
   10845                 :            :         &sensor_dev_attr_temp1_crit.dev_attr.attr,
   10846                 :            :         &sensor_dev_attr_temp1_max.dev_attr.attr,
   10847                 :            :         NULL
   10848                 :            : };
   10849                 :            : ATTRIBUTE_GROUPS(tg3);
   10850                 :            : 
   10851                 :          0 : static void tg3_hwmon_close(struct tg3 *tp)
   10852                 :            : {
   10853                 :          0 :         if (tp->hwmon_dev) {
   10854                 :          0 :                 hwmon_device_unregister(tp->hwmon_dev);
   10855                 :          0 :                 tp->hwmon_dev = NULL;
   10856                 :            :         }
   10857                 :            : }
   10858                 :            : 
   10859                 :          0 : static void tg3_hwmon_open(struct tg3 *tp)
   10860                 :            : {
   10861                 :          0 :         int i;
   10862                 :          0 :         u32 size = 0;
   10863                 :          0 :         struct pci_dev *pdev = tp->pdev;
   10864                 :          0 :         struct tg3_ocir ocirs[TG3_SD_NUM_RECS];
   10865                 :            : 
   10866                 :          0 :         tg3_sd_scan_scratchpad(tp, ocirs);
   10867                 :            : 
   10868         [ #  # ]:          0 :         for (i = 0; i < TG3_SD_NUM_RECS; i++) {
   10869         [ #  # ]:          0 :                 if (!ocirs[i].src_data_length)
   10870                 :          0 :                         continue;
   10871                 :            : 
   10872                 :          0 :                 size += ocirs[i].src_hdr_length;
   10873                 :          0 :                 size += ocirs[i].src_data_length;
   10874                 :            :         }
   10875                 :            : 
   10876         [ #  # ]:          0 :         if (!size)
   10877                 :          0 :                 return;
   10878                 :            : 
   10879                 :          0 :         tp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, "tg3",
   10880                 :            :                                                           tp, tg3_groups);
   10881         [ #  # ]:          0 :         if (IS_ERR(tp->hwmon_dev)) {
   10882                 :          0 :                 tp->hwmon_dev = NULL;
   10883                 :          0 :                 dev_err(&pdev->dev, "Cannot register hwmon device, aborting\n");
   10884                 :            :         }
   10885                 :            : }
   10886                 :            : #else
   10887                 :            : static inline void tg3_hwmon_close(struct tg3 *tp) { }
   10888                 :            : static inline void tg3_hwmon_open(struct tg3 *tp) { }
   10889                 :            : #endif /* CONFIG_TIGON3_HWMON */
   10890                 :            : 
   10891                 :            : 
   10892                 :            : #define TG3_STAT_ADD32(PSTAT, REG) \
   10893                 :            : do {    u32 __val = tr32(REG); \
   10894                 :            :         (PSTAT)->low += __val; \
   10895                 :            :         if ((PSTAT)->low < __val) \
   10896                 :            :                 (PSTAT)->high += 1; \
   10897                 :            : } while (0)
   10898                 :            : 
   10899                 :          0 : static void tg3_periodic_fetch_stats(struct tg3 *tp)
   10900                 :            : {
   10901                 :          0 :         struct tg3_hw_stats *sp = tp->hw_stats;
   10902                 :            : 
   10903         [ #  # ]:          0 :         if (!tp->link_up)
   10904                 :            :                 return;
   10905                 :            : 
   10906         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS);
   10907         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS);
   10908         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT);
   10909         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT);
   10910         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS);
   10911         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS);
   10912         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS);
   10913         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED);
   10914         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL);
   10915         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL);
   10916         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST);
   10917         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST);
   10918         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST);
   10919   [ #  #  #  # ]:          0 :         if (unlikely(tg3_flag(tp, 5719_5720_RDMA_BUG) &&
   10920                 :            :                      (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low +
   10921                 :            :                       sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) {
   10922                 :          0 :                 u32 val;
   10923                 :            : 
   10924                 :          0 :                 val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL);
   10925         [ #  # ]:          0 :                 val &= ~tg3_lso_rd_dma_workaround_bit(tp);
   10926                 :          0 :                 tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val);
   10927                 :          0 :                 tg3_flag_clear(tp, 5719_5720_RDMA_BUG);
   10928                 :            :         }
   10929                 :            : 
   10930         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS);
   10931         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS);
   10932         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST);
   10933         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST);
   10934         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST);
   10935         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS);
   10936         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS);
   10937         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD);
   10938         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD);
   10939         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD);
   10940         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED);
   10941         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG);
   10942         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS);
   10943         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE);
   10944                 :            : 
   10945         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rxbds_empty, RCVLPC_NO_RCV_BD_CNT);
   10946         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5717 &&
   10947         [ #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5762 &&
   10948         [ #  # ]:          0 :             tg3_chip_rev_id(tp) != CHIPREV_ID_5719_A0 &&
   10949                 :            :             tg3_chip_rev_id(tp) != CHIPREV_ID_5720_A0) {
   10950         [ #  # ]:          0 :                 TG3_STAT_ADD32(&sp->rx_discards, RCVLPC_IN_DISCARDS_CNT);
   10951                 :            :         } else {
   10952                 :          0 :                 u32 val = tr32(HOSTCC_FLOW_ATTN);
   10953                 :          0 :                 val = (val & HOSTCC_FLOW_ATTN_MBUF_LWM) ? 1 : 0;
   10954         [ #  # ]:          0 :                 if (val) {
   10955                 :          0 :                         tw32(HOSTCC_FLOW_ATTN, HOSTCC_FLOW_ATTN_MBUF_LWM);
   10956                 :          0 :                         sp->rx_discards.low += val;
   10957         [ #  # ]:          0 :                         if (sp->rx_discards.low < val)
   10958                 :          0 :                                 sp->rx_discards.high += 1;
   10959                 :            :                 }
   10960                 :          0 :                 sp->mbuf_lwm_thresh_hit = sp->rx_discards;
   10961                 :            :         }
   10962         [ #  # ]:          0 :         TG3_STAT_ADD32(&sp->rx_errors, RCVLPC_IN_ERRORS_CNT);
   10963                 :            : }
   10964                 :            : 
   10965                 :          0 : static void tg3_chk_missed_msi(struct tg3 *tp)
   10966                 :            : {
   10967                 :          0 :         u32 i;
   10968                 :            : 
   10969         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
   10970                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
   10971                 :            : 
   10972         [ #  # ]:          0 :                 if (tg3_has_work(tnapi)) {
   10973         [ #  # ]:          0 :                         if (tnapi->last_rx_cons == tnapi->rx_rcb_ptr &&
   10974         [ #  # ]:          0 :                             tnapi->last_tx_cons == tnapi->tx_cons) {
   10975         [ #  # ]:          0 :                                 if (tnapi->chk_msi_cnt < 1) {
   10976                 :          0 :                                         tnapi->chk_msi_cnt++;
   10977                 :          0 :                                         return;
   10978                 :            :                                 }
   10979                 :          0 :                                 tg3_msi(0, tnapi);
   10980                 :            :                         }
   10981                 :            :                 }
   10982                 :          0 :                 tnapi->chk_msi_cnt = 0;
   10983                 :          0 :                 tnapi->last_rx_cons = tnapi->rx_rcb_ptr;
   10984                 :          0 :                 tnapi->last_tx_cons = tnapi->tx_cons;
   10985                 :            :         }
   10986                 :            : }
   10987                 :            : 
   10988                 :          0 : static void tg3_timer(struct timer_list *t)
   10989                 :            : {
   10990                 :          0 :         struct tg3 *tp = from_timer(tp, t, timer);
   10991                 :            : 
   10992                 :          0 :         spin_lock(&tp->lock);
   10993                 :            : 
   10994   [ #  #  #  # ]:          0 :         if (tp->irq_sync || tg3_flag(tp, RESET_TASK_PENDING)) {
   10995                 :          0 :                 spin_unlock(&tp->lock);
   10996                 :          0 :                 goto restart_timer;
   10997                 :            :         }
   10998                 :            : 
   10999   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   11000                 :            :             tg3_flag(tp, 57765_CLASS))
   11001                 :          0 :                 tg3_chk_missed_msi(tp);
   11002                 :            : 
   11003         [ #  # ]:          0 :         if (tg3_flag(tp, FLUSH_POSTED_WRITES)) {
   11004                 :            :                 /* BCM4785: Flush posted writes from GbE to host memory. */
   11005                 :          0 :                 tr32(HOSTCC_MODE);
   11006                 :            :         }
   11007                 :            : 
   11008         [ #  # ]:          0 :         if (!tg3_flag(tp, TAGGED_STATUS)) {
   11009                 :            :                 /* All of this garbage is because when using non-tagged
   11010                 :            :                  * IRQ status the mailbox/status_block protocol the chip
   11011                 :            :                  * uses with the cpu is race prone.
   11012                 :            :                  */
   11013         [ #  # ]:          0 :                 if (tp->napi[0].hw_status->status & SD_STATUS_UPDATED) {
   11014                 :          0 :                         tw32(GRC_LOCAL_CTRL,
   11015                 :            :                              tp->grc_local_ctrl | GRC_LCLCTRL_SETINT);
   11016                 :            :                 } else {
   11017                 :          0 :                         tw32(HOSTCC_MODE, tp->coalesce_mode |
   11018                 :            :                              HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW);
   11019                 :            :                 }
   11020                 :            : 
   11021         [ #  # ]:          0 :                 if (!(tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
   11022                 :          0 :                         spin_unlock(&tp->lock);
   11023                 :          0 :                         tg3_reset_task_schedule(tp);
   11024                 :          0 :                         goto restart_timer;
   11025                 :            :                 }
   11026                 :            :         }
   11027                 :            : 
   11028                 :            :         /* This part only runs once per second. */
   11029         [ #  # ]:          0 :         if (!--tp->timer_counter) {
   11030         [ #  # ]:          0 :                 if (tg3_flag(tp, 5705_PLUS))
   11031                 :          0 :                         tg3_periodic_fetch_stats(tp);
   11032                 :            : 
   11033   [ #  #  #  # ]:          0 :                 if (tp->setlpicnt && !--tp->setlpicnt)
   11034                 :          0 :                         tg3_phy_eee_enable(tp);
   11035                 :            : 
   11036         [ #  # ]:          0 :                 if (tg3_flag(tp, USE_LINKCHG_REG)) {
   11037                 :          0 :                         u32 mac_stat;
   11038                 :          0 :                         int phy_event;
   11039                 :            : 
   11040                 :          0 :                         mac_stat = tr32(MAC_STATUS);
   11041                 :            : 
   11042                 :          0 :                         phy_event = 0;
   11043         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT) {
   11044         [ #  # ]:          0 :                                 if (mac_stat & MAC_STATUS_MI_INTERRUPT)
   11045                 :            :                                         phy_event = 1;
   11046         [ #  # ]:          0 :                         } else if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)
   11047                 :            :                                 phy_event = 1;
   11048                 :            : 
   11049                 :            :                         if (phy_event)
   11050                 :          0 :                                 tg3_setup_phy(tp, false);
   11051         [ #  # ]:          0 :                 } else if (tg3_flag(tp, POLL_SERDES)) {
   11052                 :          0 :                         u32 mac_stat = tr32(MAC_STATUS);
   11053                 :          0 :                         int need_setup = 0;
   11054                 :            : 
   11055         [ #  # ]:          0 :                         if (tp->link_up &&
   11056         [ #  # ]:          0 :                             (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)) {
   11057                 :          0 :                                 need_setup = 1;
   11058                 :            :                         }
   11059         [ #  # ]:          0 :                         if (!tp->link_up &&
   11060         [ #  # ]:          0 :                             (mac_stat & (MAC_STATUS_PCS_SYNCED |
   11061                 :            :                                          MAC_STATUS_SIGNAL_DET))) {
   11062                 :            :                                 need_setup = 1;
   11063                 :            :                         }
   11064         [ #  # ]:          0 :                         if (need_setup) {
   11065         [ #  # ]:          0 :                                 if (!tp->serdes_counter) {
   11066                 :          0 :                                         tw32_f(MAC_MODE,
   11067                 :            :                                              (tp->mac_mode &
   11068                 :            :                                               ~MAC_MODE_PORT_MODE_MASK));
   11069                 :          0 :                                         udelay(40);
   11070                 :          0 :                                         tw32_f(MAC_MODE, tp->mac_mode);
   11071                 :          0 :                                         udelay(40);
   11072                 :            :                                 }
   11073                 :          0 :                                 tg3_setup_phy(tp, false);
   11074                 :            :                         }
   11075   [ #  #  #  # ]:          0 :                 } else if ((tp->phy_flags & TG3_PHYFLG_MII_SERDES) &&
   11076                 :            :                            tg3_flag(tp, 5780_CLASS)) {
   11077                 :          0 :                         tg3_serdes_parallel_detect(tp);
   11078         [ #  # ]:          0 :                 } else if (tg3_flag(tp, POLL_CPMU_LINK)) {
   11079                 :          0 :                         u32 cpmu = tr32(TG3_CPMU_STATUS);
   11080                 :          0 :                         bool link_up = !((cpmu & TG3_CPMU_STATUS_LINK_MASK) ==
   11081                 :            :                                          TG3_CPMU_STATUS_LINK_MASK);
   11082                 :            : 
   11083         [ #  # ]:          0 :                         if (link_up != tp->link_up)
   11084                 :          0 :                                 tg3_setup_phy(tp, false);
   11085                 :            :                 }
   11086                 :            : 
   11087                 :          0 :                 tp->timer_counter = tp->timer_multiplier;
   11088                 :            :         }
   11089                 :            : 
   11090                 :            :         /* Heartbeat is only sent once every 2 seconds.
   11091                 :            :          *
   11092                 :            :          * The heartbeat is to tell the ASF firmware that the host
   11093                 :            :          * driver is still alive.  In the event that the OS crashes,
   11094                 :            :          * ASF needs to reset the hardware to free up the FIFO space
   11095                 :            :          * that may be filled with rx packets destined for the host.
   11096                 :            :          * If the FIFO is full, ASF will no longer function properly.
   11097                 :            :          *
   11098                 :            :          * Unintended resets have been reported on real time kernels
   11099                 :            :          * where the timer doesn't run on time.  Netpoll will also have
   11100                 :            :          * same problem.
   11101                 :            :          *
   11102                 :            :          * The new FWCMD_NICDRV_ALIVE3 command tells the ASF firmware
   11103                 :            :          * to check the ring condition when the heartbeat is expiring
   11104                 :            :          * before doing the reset.  This will prevent most unintended
   11105                 :            :          * resets.
   11106                 :            :          */
   11107         [ #  # ]:          0 :         if (!--tp->asf_counter) {
   11108   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, ENABLE_ASF) && !tg3_flag(tp, ENABLE_APE)) {
   11109                 :          0 :                         tg3_wait_for_event_ack(tp);
   11110                 :            : 
   11111                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
   11112                 :            :                                       FWCMD_NICDRV_ALIVE3);
   11113                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
   11114                 :          0 :                         tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX,
   11115                 :            :                                       TG3_FW_UPDATE_TIMEOUT_SEC);
   11116                 :            : 
   11117                 :          0 :                         tg3_generate_fw_event(tp);
   11118                 :            :                 }
   11119                 :          0 :                 tp->asf_counter = tp->asf_multiplier;
   11120                 :            :         }
   11121                 :            : 
   11122                 :            :         /* Update the APE heartbeat every 5 seconds.*/
   11123                 :          0 :         tg3_send_ape_heartbeat(tp, TG3_APE_HB_INTERVAL);
   11124                 :            : 
   11125                 :          0 :         spin_unlock(&tp->lock);
   11126                 :            : 
   11127                 :          0 : restart_timer:
   11128                 :          0 :         tp->timer.expires = jiffies + tp->timer_offset;
   11129                 :          0 :         add_timer(&tp->timer);
   11130                 :          0 : }
   11131                 :            : 
   11132                 :          0 : static void tg3_timer_init(struct tg3 *tp)
   11133                 :            : {
   11134         [ #  # ]:          0 :         if (tg3_flag(tp, TAGGED_STATUS) &&
   11135   [ #  #  #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5717 &&
   11136                 :            :             !tg3_flag(tp, 57765_CLASS))
   11137                 :          0 :                 tp->timer_offset = HZ;
   11138                 :            :         else
   11139                 :          0 :                 tp->timer_offset = HZ / 10;
   11140                 :            : 
   11141         [ #  # ]:          0 :         BUG_ON(tp->timer_offset > HZ);
   11142                 :            : 
   11143                 :          0 :         tp->timer_multiplier = (HZ / tp->timer_offset);
   11144                 :          0 :         tp->asf_multiplier = (HZ / tp->timer_offset) *
   11145                 :            :                              TG3_FW_UPDATE_FREQ_SEC;
   11146                 :            : 
   11147                 :          0 :         timer_setup(&tp->timer, tg3_timer, 0);
   11148                 :          0 : }
   11149                 :            : 
   11150                 :          0 : static void tg3_timer_start(struct tg3 *tp)
   11151                 :            : {
   11152                 :          0 :         tp->asf_counter   = tp->asf_multiplier;
   11153                 :          0 :         tp->timer_counter = tp->timer_multiplier;
   11154                 :            : 
   11155                 :          0 :         tp->timer.expires = jiffies + tp->timer_offset;
   11156                 :          0 :         add_timer(&tp->timer);
   11157                 :            : }
   11158                 :            : 
   11159                 :          0 : static void tg3_timer_stop(struct tg3 *tp)
   11160                 :            : {
   11161                 :          0 :         del_timer_sync(&tp->timer);
   11162                 :            : }
   11163                 :            : 
   11164                 :            : /* Restart hardware after configuration changes, self-test, etc.
   11165                 :            :  * Invoked with tp->lock held.
   11166                 :            :  */
   11167                 :          0 : static int tg3_restart_hw(struct tg3 *tp, bool reset_phy)
   11168                 :            :         __releases(tp->lock)
   11169                 :            :         __acquires(tp->lock)
   11170                 :            : {
   11171                 :          0 :         int err;
   11172                 :            : 
   11173                 :          0 :         err = tg3_init_hw(tp, reset_phy);
   11174         [ #  # ]:          0 :         if (err) {
   11175                 :          0 :                 netdev_err(tp->dev,
   11176                 :            :                            "Failed to re-initialize device, aborting\n");
   11177                 :          0 :                 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   11178                 :          0 :                 tg3_full_unlock(tp);
   11179                 :          0 :                 tg3_timer_stop(tp);
   11180                 :          0 :                 tp->irq_sync = 0;
   11181                 :          0 :                 tg3_napi_enable(tp);
   11182                 :          0 :                 dev_close(tp->dev);
   11183                 :          0 :                 tg3_full_lock(tp, 0);
   11184                 :            :         }
   11185                 :          0 :         return err;
   11186                 :            : }
   11187                 :            : 
   11188                 :          0 : static void tg3_reset_task(struct work_struct *work)
   11189                 :            : {
   11190                 :          0 :         struct tg3 *tp = container_of(work, struct tg3, reset_task);
   11191                 :          0 :         int err;
   11192                 :            : 
   11193                 :          0 :         rtnl_lock();
   11194                 :          0 :         tg3_full_lock(tp, 0);
   11195                 :            : 
   11196         [ #  # ]:          0 :         if (!netif_running(tp->dev)) {
   11197                 :          0 :                 tg3_flag_clear(tp, RESET_TASK_PENDING);
   11198                 :          0 :                 tg3_full_unlock(tp);
   11199                 :          0 :                 rtnl_unlock();
   11200                 :          0 :                 return;
   11201                 :            :         }
   11202                 :            : 
   11203                 :          0 :         tg3_full_unlock(tp);
   11204                 :            : 
   11205                 :          0 :         tg3_phy_stop(tp);
   11206                 :            : 
   11207                 :          0 :         tg3_netif_stop(tp);
   11208                 :            : 
   11209                 :          0 :         tg3_full_lock(tp, 1);
   11210                 :            : 
   11211         [ #  # ]:          0 :         if (tg3_flag(tp, TX_RECOVERY_PENDING)) {
   11212                 :          0 :                 tp->write32_tx_mbox = tg3_write32_tx_mbox;
   11213                 :          0 :                 tp->write32_rx_mbox = tg3_write_flush_reg32;
   11214                 :          0 :                 tg3_flag_set(tp, MBOX_WRITE_REORDER);
   11215                 :          0 :                 tg3_flag_clear(tp, TX_RECOVERY_PENDING);
   11216                 :            :         }
   11217                 :            : 
   11218                 :          0 :         tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
   11219                 :          0 :         err = tg3_init_hw(tp, true);
   11220         [ #  # ]:          0 :         if (err)
   11221                 :          0 :                 goto out;
   11222                 :            : 
   11223                 :          0 :         tg3_netif_start(tp);
   11224                 :            : 
   11225                 :          0 : out:
   11226                 :          0 :         tg3_full_unlock(tp);
   11227                 :            : 
   11228         [ #  # ]:          0 :         if (!err)
   11229                 :          0 :                 tg3_phy_start(tp);
   11230                 :            : 
   11231                 :          0 :         tg3_flag_clear(tp, RESET_TASK_PENDING);
   11232                 :          0 :         rtnl_unlock();
   11233                 :            : }
   11234                 :            : 
   11235                 :          0 : static int tg3_request_irq(struct tg3 *tp, int irq_num)
   11236                 :            : {
   11237                 :          0 :         irq_handler_t fn;
   11238                 :          0 :         unsigned long flags;
   11239                 :          0 :         char *name;
   11240                 :          0 :         struct tg3_napi *tnapi = &tp->napi[irq_num];
   11241                 :            : 
   11242         [ #  # ]:          0 :         if (tp->irq_cnt == 1)
   11243                 :          0 :                 name = tp->dev->name;
   11244                 :            :         else {
   11245                 :          0 :                 name = &tnapi->irq_lbl[0];
   11246   [ #  #  #  # ]:          0 :                 if (tnapi->tx_buffers && tnapi->rx_rcb)
   11247                 :          0 :                         snprintf(name, IFNAMSIZ,
   11248                 :          0 :                                  "%s-txrx-%d", tp->dev->name, irq_num);
   11249         [ #  # ]:          0 :                 else if (tnapi->tx_buffers)
   11250                 :          0 :                         snprintf(name, IFNAMSIZ,
   11251                 :          0 :                                  "%s-tx-%d", tp->dev->name, irq_num);
   11252         [ #  # ]:          0 :                 else if (tnapi->rx_rcb)
   11253                 :          0 :                         snprintf(name, IFNAMSIZ,
   11254                 :          0 :                                  "%s-rx-%d", tp->dev->name, irq_num);
   11255                 :            :                 else
   11256                 :          0 :                         snprintf(name, IFNAMSIZ,
   11257                 :          0 :                                  "%s-%d", tp->dev->name, irq_num);
   11258                 :          0 :                 name[IFNAMSIZ-1] = 0;
   11259                 :            :         }
   11260                 :            : 
   11261   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, USING_MSI) || tg3_flag(tp, USING_MSIX)) {
   11262                 :          0 :                 fn = tg3_msi;
   11263         [ #  # ]:          0 :                 if (tg3_flag(tp, 1SHOT_MSI))
   11264                 :          0 :                         fn = tg3_msi_1shot;
   11265                 :            :                 flags = 0;
   11266                 :            :         } else {
   11267                 :          0 :                 fn = tg3_interrupt;
   11268         [ #  # ]:          0 :                 if (tg3_flag(tp, TAGGED_STATUS))
   11269                 :          0 :                         fn = tg3_interrupt_tagged;
   11270                 :            :                 flags = IRQF_SHARED;
   11271                 :            :         }
   11272                 :            : 
   11273                 :          0 :         return request_irq(tnapi->irq_vec, fn, flags, name, tnapi);
   11274                 :            : }
   11275                 :            : 
   11276                 :          0 : static int tg3_test_interrupt(struct tg3 *tp)
   11277                 :            : {
   11278                 :          0 :         struct tg3_napi *tnapi = &tp->napi[0];
   11279                 :          0 :         struct net_device *dev = tp->dev;
   11280                 :          0 :         int err, i, intr_ok = 0;
   11281                 :          0 :         u32 val;
   11282                 :            : 
   11283         [ #  # ]:          0 :         if (!netif_running(dev))
   11284                 :            :                 return -ENODEV;
   11285                 :            : 
   11286                 :          0 :         tg3_disable_ints(tp);
   11287                 :            : 
   11288                 :          0 :         free_irq(tnapi->irq_vec, tnapi);
   11289                 :            : 
   11290                 :            :         /*
   11291                 :            :          * Turn off MSI one shot mode.  Otherwise this test has no
   11292                 :            :          * observable way to know whether the interrupt was delivered.
   11293                 :            :          */
   11294         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS)) {
   11295                 :          0 :                 val = tr32(MSGINT_MODE) | MSGINT_MODE_ONE_SHOT_DISABLE;
   11296                 :          0 :                 tw32(MSGINT_MODE, val);
   11297                 :            :         }
   11298                 :            : 
   11299                 :          0 :         err = request_irq(tnapi->irq_vec, tg3_test_isr,
   11300                 :          0 :                           IRQF_SHARED, dev->name, tnapi);
   11301         [ #  # ]:          0 :         if (err)
   11302                 :            :                 return err;
   11303                 :            : 
   11304                 :          0 :         tnapi->hw_status->status &= ~SD_STATUS_UPDATED;
   11305                 :          0 :         tg3_enable_ints(tp);
   11306                 :            : 
   11307                 :          0 :         tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
   11308                 :            :                tnapi->coal_now);
   11309                 :            : 
   11310         [ #  # ]:          0 :         for (i = 0; i < 5; i++) {
   11311                 :          0 :                 u32 int_mbox, misc_host_ctrl;
   11312                 :            : 
   11313                 :          0 :                 int_mbox = tr32_mailbox(tnapi->int_mbox);
   11314                 :          0 :                 misc_host_ctrl = tr32(TG3PCI_MISC_HOST_CTRL);
   11315                 :            : 
   11316         [ #  # ]:          0 :                 if ((int_mbox != 0) ||
   11317         [ #  # ]:          0 :                     (misc_host_ctrl & MISC_HOST_CTRL_MASK_PCI_INT)) {
   11318                 :            :                         intr_ok = 1;
   11319                 :            :                         break;
   11320                 :            :                 }
   11321                 :            : 
   11322         [ #  # ]:          0 :                 if (tg3_flag(tp, 57765_PLUS) &&
   11323         [ #  # ]:          0 :                     tnapi->hw_status->status_tag != tnapi->last_tag)
   11324                 :          0 :                         tw32_mailbox_f(tnapi->int_mbox, tnapi->last_tag << 24);
   11325                 :            : 
   11326                 :          0 :                 msleep(10);
   11327                 :            :         }
   11328                 :            : 
   11329                 :          0 :         tg3_disable_ints(tp);
   11330                 :            : 
   11331                 :          0 :         free_irq(tnapi->irq_vec, tnapi);
   11332                 :            : 
   11333                 :          0 :         err = tg3_request_irq(tp, 0);
   11334                 :            : 
   11335         [ #  # ]:          0 :         if (err)
   11336                 :            :                 return err;
   11337                 :            : 
   11338         [ #  # ]:          0 :         if (intr_ok) {
   11339                 :            :                 /* Reenable MSI one shot mode. */
   11340   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, 57765_PLUS) && tg3_flag(tp, 1SHOT_MSI)) {
   11341                 :          0 :                         val = tr32(MSGINT_MODE) & ~MSGINT_MODE_ONE_SHOT_DISABLE;
   11342                 :          0 :                         tw32(MSGINT_MODE, val);
   11343                 :            :                 }
   11344                 :          0 :                 return 0;
   11345                 :            :         }
   11346                 :            : 
   11347                 :            :         return -EIO;
   11348                 :            : }
   11349                 :            : 
   11350                 :            : /* Returns 0 if MSI test succeeds or MSI test fails and INTx mode is
   11351                 :            :  * successfully restored
   11352                 :            :  */
   11353                 :          0 : static int tg3_test_msi(struct tg3 *tp)
   11354                 :            : {
   11355                 :          0 :         int err;
   11356                 :          0 :         u16 pci_cmd;
   11357                 :            : 
   11358         [ #  # ]:          0 :         if (!tg3_flag(tp, USING_MSI))
   11359                 :            :                 return 0;
   11360                 :            : 
   11361                 :            :         /* Turn off SERR reporting in case MSI terminates with Master
   11362                 :            :          * Abort.
   11363                 :            :          */
   11364                 :          0 :         pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
   11365                 :          0 :         pci_write_config_word(tp->pdev, PCI_COMMAND,
   11366                 :          0 :                               pci_cmd & ~PCI_COMMAND_SERR);
   11367                 :            : 
   11368                 :          0 :         err = tg3_test_interrupt(tp);
   11369                 :            : 
   11370                 :          0 :         pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
   11371                 :            : 
   11372         [ #  # ]:          0 :         if (!err)
   11373                 :            :                 return 0;
   11374                 :            : 
   11375                 :            :         /* other failures */
   11376         [ #  # ]:          0 :         if (err != -EIO)
   11377                 :            :                 return err;
   11378                 :            : 
   11379                 :            :         /* MSI test failed, go back to INTx mode */
   11380                 :          0 :         netdev_warn(tp->dev, "No interrupt was generated using MSI. Switching "
   11381                 :            :                     "to INTx mode. Please report this failure to the PCI "
   11382                 :            :                     "maintainer and include system chipset information\n");
   11383                 :            : 
   11384                 :          0 :         free_irq(tp->napi[0].irq_vec, &tp->napi[0]);
   11385                 :            : 
   11386                 :          0 :         pci_disable_msi(tp->pdev);
   11387                 :            : 
   11388                 :          0 :         tg3_flag_clear(tp, USING_MSI);
   11389                 :          0 :         tp->napi[0].irq_vec = tp->pdev->irq;
   11390                 :            : 
   11391                 :          0 :         err = tg3_request_irq(tp, 0);
   11392         [ #  # ]:          0 :         if (err)
   11393                 :            :                 return err;
   11394                 :            : 
   11395                 :            :         /* Need to reset the chip because the MSI cycle may have terminated
   11396                 :            :          * with Master Abort.
   11397                 :            :          */
   11398                 :          0 :         tg3_full_lock(tp, 1);
   11399                 :            : 
   11400                 :          0 :         tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   11401                 :          0 :         err = tg3_init_hw(tp, true);
   11402                 :            : 
   11403                 :          0 :         tg3_full_unlock(tp);
   11404                 :            : 
   11405         [ #  # ]:          0 :         if (err)
   11406                 :          0 :                 free_irq(tp->napi[0].irq_vec, &tp->napi[0]);
   11407                 :            : 
   11408                 :            :         return err;
   11409                 :            : }
   11410                 :            : 
   11411                 :          0 : static int tg3_request_firmware(struct tg3 *tp)
   11412                 :            : {
   11413                 :          0 :         const struct tg3_firmware_hdr *fw_hdr;
   11414                 :            : 
   11415         [ #  # ]:          0 :         if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) {
   11416                 :          0 :                 netdev_err(tp->dev, "Failed to load firmware \"%s\"\n",
   11417                 :            :                            tp->fw_needed);
   11418                 :          0 :                 return -ENOENT;
   11419                 :            :         }
   11420                 :            : 
   11421                 :          0 :         fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
   11422                 :            : 
   11423                 :            :         /* Firmware blob starts with version numbers, followed by
   11424                 :            :          * start address and _full_ length including BSS sections
   11425                 :            :          * (which must be longer than the actual data, of course
   11426                 :            :          */
   11427                 :            : 
   11428                 :          0 :         tp->fw_len = be32_to_cpu(fw_hdr->len);    /* includes bss */
   11429         [ #  # ]:          0 :         if (tp->fw_len < (tp->fw->size - TG3_FW_HDR_LEN)) {
   11430                 :          0 :                 netdev_err(tp->dev, "bogus length %d in \"%s\"\n",
   11431                 :            :                            tp->fw_len, tp->fw_needed);
   11432                 :          0 :                 release_firmware(tp->fw);
   11433                 :          0 :                 tp->fw = NULL;
   11434                 :          0 :                 return -EINVAL;
   11435                 :            :         }
   11436                 :            : 
   11437                 :            :         /* We no longer need firmware; we have it. */
   11438                 :          0 :         tp->fw_needed = NULL;
   11439                 :          0 :         return 0;
   11440                 :            : }
   11441                 :            : 
   11442                 :          0 : static u32 tg3_irq_count(struct tg3 *tp)
   11443                 :            : {
   11444                 :          0 :         u32 irq_cnt = max(tp->rxq_cnt, tp->txq_cnt);
   11445                 :            : 
   11446                 :          0 :         if (irq_cnt > 1) {
   11447                 :            :                 /* We want as many rx rings enabled as there are cpus.
   11448                 :            :                  * In multiqueue MSI-X mode, the first MSI-X vector
   11449                 :            :                  * only deals with link interrupts, etc, so we add
   11450                 :            :                  * one to the number of vectors we are requesting.
   11451                 :            :                  */
   11452                 :          0 :                 irq_cnt = min_t(unsigned, irq_cnt + 1, tp->irq_max);
   11453                 :            :         }
   11454                 :            : 
   11455                 :          0 :         return irq_cnt;
   11456                 :            : }
   11457                 :            : 
   11458                 :          0 : static bool tg3_enable_msix(struct tg3 *tp)
   11459                 :            : {
   11460                 :          0 :         int i, rc;
   11461                 :          0 :         struct msix_entry msix_ent[TG3_IRQ_MAX_VECS];
   11462                 :            : 
   11463                 :          0 :         tp->txq_cnt = tp->txq_req;
   11464                 :          0 :         tp->rxq_cnt = tp->rxq_req;
   11465         [ #  # ]:          0 :         if (!tp->rxq_cnt)
   11466                 :          0 :                 tp->rxq_cnt = netif_get_num_default_rss_queues();
   11467         [ #  # ]:          0 :         if (tp->rxq_cnt > tp->rxq_max)
   11468                 :          0 :                 tp->rxq_cnt = tp->rxq_max;
   11469                 :            : 
   11470                 :            :         /* Disable multiple TX rings by default.  Simple round-robin hardware
   11471                 :            :          * scheduling of the TX rings can cause starvation of rings with
   11472                 :            :          * small packets when other rings have TSO or jumbo packets.
   11473                 :            :          */
   11474         [ #  # ]:          0 :         if (!tp->txq_req)
   11475                 :          0 :                 tp->txq_cnt = 1;
   11476                 :            : 
   11477         [ #  # ]:          0 :         tp->irq_cnt = tg3_irq_count(tp);
   11478                 :            : 
   11479         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++) {
   11480                 :          0 :                 msix_ent[i].entry  = i;
   11481                 :          0 :                 msix_ent[i].vector = 0;
   11482                 :            :         }
   11483                 :            : 
   11484                 :          0 :         rc = pci_enable_msix_range(tp->pdev, msix_ent, 1, tp->irq_cnt);
   11485         [ #  # ]:          0 :         if (rc < 0) {
   11486                 :            :                 return false;
   11487         [ #  # ]:          0 :         } else if (rc < tp->irq_cnt) {
   11488                 :          0 :                 netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n",
   11489                 :            :                               tp->irq_cnt, rc);
   11490                 :          0 :                 tp->irq_cnt = rc;
   11491                 :          0 :                 tp->rxq_cnt = max(rc - 1, 1);
   11492         [ #  # ]:          0 :                 if (tp->txq_cnt)
   11493                 :          0 :                         tp->txq_cnt = min(tp->rxq_cnt, tp->txq_max);
   11494                 :            :         }
   11495                 :            : 
   11496         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++)
   11497                 :          0 :                 tp->napi[i].irq_vec = msix_ent[i].vector;
   11498                 :            : 
   11499         [ #  # ]:          0 :         if (netif_set_real_num_rx_queues(tp->dev, tp->rxq_cnt)) {
   11500                 :          0 :                 pci_disable_msix(tp->pdev);
   11501                 :          0 :                 return false;
   11502                 :            :         }
   11503                 :            : 
   11504         [ #  # ]:          0 :         if (tp->irq_cnt == 1)
   11505                 :            :                 return true;
   11506                 :            : 
   11507                 :          0 :         tg3_flag_set(tp, ENABLE_RSS);
   11508                 :            : 
   11509         [ #  # ]:          0 :         if (tp->txq_cnt > 1)
   11510                 :          0 :                 tg3_flag_set(tp, ENABLE_TSS);
   11511                 :            : 
   11512                 :          0 :         netif_set_real_num_tx_queues(tp->dev, tp->txq_cnt);
   11513                 :            : 
   11514                 :          0 :         return true;
   11515                 :            : }
   11516                 :            : 
   11517                 :          0 : static void tg3_ints_init(struct tg3 *tp)
   11518                 :            : {
   11519   [ #  #  #  #  :          0 :         if ((tg3_flag(tp, SUPPORT_MSI) || tg3_flag(tp, SUPPORT_MSIX)) &&
                   #  # ]
   11520                 :            :             !tg3_flag(tp, TAGGED_STATUS)) {
   11521                 :            :                 /* All MSI supporting chips should support tagged
   11522                 :            :                  * status.  Assert that this is the case.
   11523                 :            :                  */
   11524                 :          0 :                 netdev_warn(tp->dev,
   11525                 :            :                             "MSI without TAGGED_STATUS? Not using MSI\n");
   11526                 :          0 :                 goto defcfg;
   11527                 :            :         }
   11528                 :            : 
   11529   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, SUPPORT_MSIX) && tg3_enable_msix(tp))
   11530                 :          0 :                 tg3_flag_set(tp, USING_MSIX);
   11531   [ #  #  #  # ]:          0 :         else if (tg3_flag(tp, SUPPORT_MSI) && pci_enable_msi(tp->pdev) == 0)
   11532                 :          0 :                 tg3_flag_set(tp, USING_MSI);
   11533                 :            : 
   11534   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, USING_MSI) || tg3_flag(tp, USING_MSIX)) {
   11535                 :          0 :                 u32 msi_mode = tr32(MSGINT_MODE);
   11536   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, USING_MSIX) && tp->irq_cnt > 1)
   11537                 :          0 :                         msi_mode |= MSGINT_MODE_MULTIVEC_EN;
   11538         [ #  # ]:          0 :                 if (!tg3_flag(tp, 1SHOT_MSI))
   11539                 :          0 :                         msi_mode |= MSGINT_MODE_ONE_SHOT_DISABLE;
   11540                 :          0 :                 tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE);
   11541                 :            :         }
   11542                 :          0 : defcfg:
   11543         [ #  # ]:          0 :         if (!tg3_flag(tp, USING_MSIX)) {
   11544                 :          0 :                 tp->irq_cnt = 1;
   11545                 :          0 :                 tp->napi[0].irq_vec = tp->pdev->irq;
   11546                 :            :         }
   11547                 :            : 
   11548         [ #  # ]:          0 :         if (tp->irq_cnt == 1) {
   11549                 :          0 :                 tp->txq_cnt = 1;
   11550                 :          0 :                 tp->rxq_cnt = 1;
   11551                 :          0 :                 netif_set_real_num_tx_queues(tp->dev, 1);
   11552                 :          0 :                 netif_set_real_num_rx_queues(tp->dev, 1);
   11553                 :            :         }
   11554                 :          0 : }
   11555                 :            : 
   11556                 :          0 : static void tg3_ints_fini(struct tg3 *tp)
   11557                 :            : {
   11558         [ #  # ]:          0 :         if (tg3_flag(tp, USING_MSIX))
   11559                 :          0 :                 pci_disable_msix(tp->pdev);
   11560         [ #  # ]:          0 :         else if (tg3_flag(tp, USING_MSI))
   11561                 :          0 :                 pci_disable_msi(tp->pdev);
   11562                 :          0 :         tg3_flag_clear(tp, USING_MSI);
   11563                 :          0 :         tg3_flag_clear(tp, USING_MSIX);
   11564                 :          0 :         tg3_flag_clear(tp, ENABLE_RSS);
   11565                 :          0 :         tg3_flag_clear(tp, ENABLE_TSS);
   11566                 :          0 : }
   11567                 :            : 
   11568                 :          0 : static int tg3_start(struct tg3 *tp, bool reset_phy, bool test_irq,
   11569                 :            :                      bool init)
   11570                 :            : {
   11571                 :          0 :         struct net_device *dev = tp->dev;
   11572                 :          0 :         int i, err;
   11573                 :            : 
   11574                 :            :         /*
   11575                 :            :          * Setup interrupts first so we know how
   11576                 :            :          * many NAPI resources to allocate
   11577                 :            :          */
   11578                 :          0 :         tg3_ints_init(tp);
   11579                 :            : 
   11580                 :          0 :         tg3_rss_check_indir_tbl(tp);
   11581                 :            : 
   11582                 :            :         /* The placement of this call is tied
   11583                 :            :          * to the setup and use of Host TX descriptors.
   11584                 :            :          */
   11585                 :          0 :         err = tg3_alloc_consistent(tp);
   11586         [ #  # ]:          0 :         if (err)
   11587                 :          0 :                 goto out_ints_fini;
   11588                 :            : 
   11589                 :          0 :         tg3_napi_init(tp);
   11590                 :            : 
   11591                 :          0 :         tg3_napi_enable(tp);
   11592                 :            : 
   11593         [ #  # ]:          0 :         for (i = 0; i < tp->irq_cnt; i++) {
   11594                 :          0 :                 err = tg3_request_irq(tp, i);
   11595         [ #  # ]:          0 :                 if (err) {
   11596         [ #  # ]:          0 :                         for (i--; i >= 0; i--) {
   11597                 :          0 :                                 struct tg3_napi *tnapi = &tp->napi[i];
   11598                 :            : 
   11599                 :          0 :                                 free_irq(tnapi->irq_vec, tnapi);
   11600                 :            :                         }
   11601                 :          0 :                         goto out_napi_fini;
   11602                 :            :                 }
   11603                 :            :         }
   11604                 :            : 
   11605                 :          0 :         tg3_full_lock(tp, 0);
   11606                 :            : 
   11607         [ #  # ]:          0 :         if (init)
   11608                 :          0 :                 tg3_ape_driver_state_change(tp, RESET_KIND_INIT);
   11609                 :            : 
   11610                 :          0 :         err = tg3_init_hw(tp, reset_phy);
   11611         [ #  # ]:          0 :         if (err) {
   11612                 :          0 :                 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   11613                 :          0 :                 tg3_free_rings(tp);
   11614                 :            :         }
   11615                 :            : 
   11616                 :          0 :         tg3_full_unlock(tp);
   11617                 :            : 
   11618         [ #  # ]:          0 :         if (err)
   11619                 :          0 :                 goto out_free_irq;
   11620                 :            : 
   11621   [ #  #  #  # ]:          0 :         if (test_irq && tg3_flag(tp, USING_MSI)) {
   11622                 :          0 :                 err = tg3_test_msi(tp);
   11623                 :            : 
   11624         [ #  # ]:          0 :                 if (err) {
   11625                 :          0 :                         tg3_full_lock(tp, 0);
   11626                 :          0 :                         tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   11627                 :          0 :                         tg3_free_rings(tp);
   11628                 :          0 :                         tg3_full_unlock(tp);
   11629                 :            : 
   11630                 :          0 :                         goto out_napi_fini;
   11631                 :            :                 }
   11632                 :            : 
   11633   [ #  #  #  # ]:          0 :                 if (!tg3_flag(tp, 57765_PLUS) && tg3_flag(tp, USING_MSI)) {
   11634                 :          0 :                         u32 val = tr32(PCIE_TRANSACTION_CFG);
   11635                 :            : 
   11636                 :          0 :                         tw32(PCIE_TRANSACTION_CFG,
   11637                 :            :                              val | PCIE_TRANS_CFG_1SHOT_MSI);
   11638                 :            :                 }
   11639                 :            :         }
   11640                 :            : 
   11641                 :          0 :         tg3_phy_start(tp);
   11642                 :            : 
   11643                 :          0 :         tg3_hwmon_open(tp);
   11644                 :            : 
   11645                 :          0 :         tg3_full_lock(tp, 0);
   11646                 :            : 
   11647                 :          0 :         tg3_timer_start(tp);
   11648                 :          0 :         tg3_flag_set(tp, INIT_COMPLETE);
   11649                 :          0 :         tg3_enable_ints(tp);
   11650                 :            : 
   11651                 :          0 :         tg3_ptp_resume(tp);
   11652                 :            : 
   11653                 :          0 :         tg3_full_unlock(tp);
   11654                 :            : 
   11655                 :            :         netif_tx_start_all_queues(dev);
   11656                 :            : 
   11657                 :            :         /*
   11658                 :            :          * Reset loopback feature if it was turned on while the device was down
   11659                 :            :          * make sure that it's installed properly now.
   11660                 :            :          */
   11661         [ #  # ]:          0 :         if (dev->features & NETIF_F_LOOPBACK)
   11662                 :          0 :                 tg3_set_loopback(dev, dev->features);
   11663                 :            : 
   11664                 :            :         return 0;
   11665                 :            : 
   11666                 :            : out_free_irq:
   11667         [ #  # ]:          0 :         for (i = tp->irq_cnt - 1; i >= 0; i--) {
   11668                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
   11669                 :          0 :                 free_irq(tnapi->irq_vec, tnapi);
   11670                 :            :         }
   11671                 :            : 
   11672                 :          0 : out_napi_fini:
   11673                 :          0 :         tg3_napi_disable(tp);
   11674                 :            :         tg3_napi_fini(tp);
   11675                 :          0 :         tg3_free_consistent(tp);
   11676                 :            : 
   11677                 :          0 : out_ints_fini:
   11678                 :          0 :         tg3_ints_fini(tp);
   11679                 :            : 
   11680                 :          0 :         return err;
   11681                 :            : }
   11682                 :            : 
   11683                 :          0 : static void tg3_stop(struct tg3 *tp)
   11684                 :            : {
   11685                 :          0 :         int i;
   11686                 :            : 
   11687                 :          0 :         tg3_reset_task_cancel(tp);
   11688                 :          0 :         tg3_netif_stop(tp);
   11689                 :            : 
   11690                 :          0 :         tg3_timer_stop(tp);
   11691                 :            : 
   11692         [ #  # ]:          0 :         tg3_hwmon_close(tp);
   11693                 :            : 
   11694                 :          0 :         tg3_phy_stop(tp);
   11695                 :            : 
   11696                 :          0 :         tg3_full_lock(tp, 1);
   11697                 :            : 
   11698                 :          0 :         tg3_disable_ints(tp);
   11699                 :            : 
   11700                 :          0 :         tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   11701                 :          0 :         tg3_free_rings(tp);
   11702                 :          0 :         tg3_flag_clear(tp, INIT_COMPLETE);
   11703                 :            : 
   11704                 :          0 :         tg3_full_unlock(tp);
   11705                 :            : 
   11706         [ #  # ]:          0 :         for (i = tp->irq_cnt - 1; i >= 0; i--) {
   11707                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
   11708                 :          0 :                 free_irq(tnapi->irq_vec, tnapi);
   11709                 :            :         }
   11710                 :            : 
   11711                 :          0 :         tg3_ints_fini(tp);
   11712                 :            : 
   11713                 :          0 :         tg3_napi_fini(tp);
   11714                 :            : 
   11715                 :          0 :         tg3_free_consistent(tp);
   11716                 :          0 : }
   11717                 :            : 
   11718                 :          0 : static int tg3_open(struct net_device *dev)
   11719                 :            : {
   11720         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   11721                 :          0 :         int err;
   11722                 :            : 
   11723         [ #  # ]:          0 :         if (tp->pcierr_recovery) {
   11724                 :          0 :                 netdev_err(dev, "Failed to open device. PCI error recovery "
   11725                 :            :                            "in progress\n");
   11726                 :          0 :                 return -EAGAIN;
   11727                 :            :         }
   11728                 :            : 
   11729         [ #  # ]:          0 :         if (tp->fw_needed) {
   11730                 :          0 :                 err = tg3_request_firmware(tp);
   11731         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_57766) {
   11732         [ #  # ]:          0 :                         if (err) {
   11733                 :          0 :                                 netdev_warn(tp->dev, "EEE capability disabled\n");
   11734                 :          0 :                                 tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP;
   11735         [ #  # ]:          0 :                         } else if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) {
   11736                 :          0 :                                 netdev_warn(tp->dev, "EEE capability restored\n");
   11737                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_EEE_CAP;
   11738                 :            :                         }
   11739         [ #  # ]:          0 :                 } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) {
   11740         [ #  # ]:          0 :                         if (err)
   11741                 :            :                                 return err;
   11742         [ #  # ]:          0 :                 } else if (err) {
   11743                 :          0 :                         netdev_warn(tp->dev, "TSO capability disabled\n");
   11744                 :          0 :                         tg3_flag_clear(tp, TSO_CAPABLE);
   11745         [ #  # ]:          0 :                 } else if (!tg3_flag(tp, TSO_CAPABLE)) {
   11746                 :          0 :                         netdev_notice(tp->dev, "TSO capability restored\n");
   11747                 :          0 :                         tg3_flag_set(tp, TSO_CAPABLE);
   11748                 :            :                 }
   11749                 :            :         }
   11750                 :            : 
   11751                 :          0 :         tg3_carrier_off(tp);
   11752                 :            : 
   11753                 :          0 :         err = tg3_power_up(tp);
   11754         [ #  # ]:          0 :         if (err)
   11755                 :            :                 return err;
   11756                 :            : 
   11757                 :          0 :         tg3_full_lock(tp, 0);
   11758                 :            : 
   11759                 :          0 :         tg3_disable_ints(tp);
   11760                 :          0 :         tg3_flag_clear(tp, INIT_COMPLETE);
   11761                 :            : 
   11762                 :          0 :         tg3_full_unlock(tp);
   11763                 :            : 
   11764                 :          0 :         err = tg3_start(tp,
   11765                 :          0 :                         !(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN),
   11766                 :            :                         true, true);
   11767         [ #  # ]:          0 :         if (err) {
   11768                 :          0 :                 tg3_frob_aux_power(tp, false);
   11769                 :          0 :                 pci_set_power_state(tp->pdev, PCI_D3hot);
   11770                 :            :         }
   11771                 :            : 
   11772                 :            :         return err;
   11773                 :            : }
   11774                 :            : 
   11775                 :          0 : static int tg3_close(struct net_device *dev)
   11776                 :            : {
   11777         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   11778                 :            : 
   11779         [ #  # ]:          0 :         if (tp->pcierr_recovery) {
   11780                 :          0 :                 netdev_err(dev, "Failed to close device. PCI error recovery "
   11781                 :            :                            "in progress\n");
   11782                 :          0 :                 return -EAGAIN;
   11783                 :            :         }
   11784                 :            : 
   11785                 :          0 :         tg3_stop(tp);
   11786                 :            : 
   11787         [ #  # ]:          0 :         if (pci_device_is_present(tp->pdev)) {
   11788                 :          0 :                 tg3_power_down_prepare(tp);
   11789                 :            : 
   11790                 :          0 :                 tg3_carrier_off(tp);
   11791                 :            :         }
   11792                 :            :         return 0;
   11793                 :            : }
   11794                 :            : 
   11795                 :          0 : static inline u64 get_stat64(tg3_stat64_t *val)
   11796                 :            : {
   11797                 :          0 :        return ((u64)val->high << 32) | ((u64)val->low);
   11798                 :            : }
   11799                 :            : 
   11800                 :          0 : static u64 tg3_calc_crc_errors(struct tg3 *tp)
   11801                 :            : {
   11802                 :          0 :         struct tg3_hw_stats *hw_stats = tp->hw_stats;
   11803                 :            : 
   11804         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) &&
   11805         [ #  # ]:          0 :             (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   11806                 :            :              tg3_asic_rev(tp) == ASIC_REV_5701)) {
   11807                 :          0 :                 u32 val;
   11808                 :            : 
   11809         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
   11810                 :          0 :                         tg3_writephy(tp, MII_TG3_TEST1,
   11811                 :            :                                      val | MII_TG3_TEST1_CRC_EN);
   11812                 :          0 :                         tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val);
   11813                 :            :                 } else
   11814                 :          0 :                         val = 0;
   11815                 :            : 
   11816                 :          0 :                 tp->phy_crc_errors += val;
   11817                 :            : 
   11818                 :          0 :                 return tp->phy_crc_errors;
   11819                 :            :         }
   11820                 :            : 
   11821                 :          0 :         return get_stat64(&hw_stats->rx_fcs_errors);
   11822                 :            : }
   11823                 :            : 
   11824                 :            : #define ESTAT_ADD(member) \
   11825                 :            :         estats->member =     old_estats->member + \
   11826                 :            :                                 get_stat64(&hw_stats->member)
   11827                 :            : 
   11828                 :          0 : static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats)
   11829                 :            : {
   11830                 :          0 :         struct tg3_ethtool_stats *old_estats = &tp->estats_prev;
   11831                 :          0 :         struct tg3_hw_stats *hw_stats = tp->hw_stats;
   11832                 :            : 
   11833                 :          0 :         ESTAT_ADD(rx_octets);
   11834                 :          0 :         ESTAT_ADD(rx_fragments);
   11835                 :          0 :         ESTAT_ADD(rx_ucast_packets);
   11836                 :          0 :         ESTAT_ADD(rx_mcast_packets);
   11837                 :          0 :         ESTAT_ADD(rx_bcast_packets);
   11838                 :          0 :         ESTAT_ADD(rx_fcs_errors);
   11839                 :          0 :         ESTAT_ADD(rx_align_errors);
   11840                 :          0 :         ESTAT_ADD(rx_xon_pause_rcvd);
   11841                 :          0 :         ESTAT_ADD(rx_xoff_pause_rcvd);
   11842                 :          0 :         ESTAT_ADD(rx_mac_ctrl_rcvd);
   11843                 :          0 :         ESTAT_ADD(rx_xoff_entered);
   11844                 :          0 :         ESTAT_ADD(rx_frame_too_long_errors);
   11845                 :          0 :         ESTAT_ADD(rx_jabbers);
   11846                 :          0 :         ESTAT_ADD(rx_undersize_packets);
   11847                 :          0 :         ESTAT_ADD(rx_in_length_errors);
   11848                 :          0 :         ESTAT_ADD(rx_out_length_errors);
   11849                 :          0 :         ESTAT_ADD(rx_64_or_less_octet_packets);
   11850                 :          0 :         ESTAT_ADD(rx_65_to_127_octet_packets);
   11851                 :          0 :         ESTAT_ADD(rx_128_to_255_octet_packets);
   11852                 :          0 :         ESTAT_ADD(rx_256_to_511_octet_packets);
   11853                 :          0 :         ESTAT_ADD(rx_512_to_1023_octet_packets);
   11854                 :          0 :         ESTAT_ADD(rx_1024_to_1522_octet_packets);
   11855                 :          0 :         ESTAT_ADD(rx_1523_to_2047_octet_packets);
   11856                 :          0 :         ESTAT_ADD(rx_2048_to_4095_octet_packets);
   11857                 :          0 :         ESTAT_ADD(rx_4096_to_8191_octet_packets);
   11858                 :          0 :         ESTAT_ADD(rx_8192_to_9022_octet_packets);
   11859                 :            : 
   11860                 :          0 :         ESTAT_ADD(tx_octets);
   11861                 :          0 :         ESTAT_ADD(tx_collisions);
   11862                 :          0 :         ESTAT_ADD(tx_xon_sent);
   11863                 :          0 :         ESTAT_ADD(tx_xoff_sent);
   11864                 :          0 :         ESTAT_ADD(tx_flow_control);
   11865                 :          0 :         ESTAT_ADD(tx_mac_errors);
   11866                 :          0 :         ESTAT_ADD(tx_single_collisions);
   11867                 :          0 :         ESTAT_ADD(tx_mult_collisions);
   11868                 :          0 :         ESTAT_ADD(tx_deferred);
   11869                 :          0 :         ESTAT_ADD(tx_excessive_collisions);
   11870                 :          0 :         ESTAT_ADD(tx_late_collisions);
   11871                 :          0 :         ESTAT_ADD(tx_collide_2times);
   11872                 :          0 :         ESTAT_ADD(tx_collide_3times);
   11873                 :          0 :         ESTAT_ADD(tx_collide_4times);
   11874                 :          0 :         ESTAT_ADD(tx_collide_5times);
   11875                 :          0 :         ESTAT_ADD(tx_collide_6times);
   11876                 :          0 :         ESTAT_ADD(tx_collide_7times);
   11877                 :          0 :         ESTAT_ADD(tx_collide_8times);
   11878                 :          0 :         ESTAT_ADD(tx_collide_9times);
   11879                 :          0 :         ESTAT_ADD(tx_collide_10times);
   11880                 :          0 :         ESTAT_ADD(tx_collide_11times);
   11881                 :          0 :         ESTAT_ADD(tx_collide_12times);
   11882                 :          0 :         ESTAT_ADD(tx_collide_13times);
   11883                 :          0 :         ESTAT_ADD(tx_collide_14times);
   11884                 :          0 :         ESTAT_ADD(tx_collide_15times);
   11885                 :          0 :         ESTAT_ADD(tx_ucast_packets);
   11886                 :          0 :         ESTAT_ADD(tx_mcast_packets);
   11887                 :          0 :         ESTAT_ADD(tx_bcast_packets);
   11888                 :          0 :         ESTAT_ADD(tx_carrier_sense_errors);
   11889                 :          0 :         ESTAT_ADD(tx_discards);
   11890                 :          0 :         ESTAT_ADD(tx_errors);
   11891                 :            : 
   11892                 :          0 :         ESTAT_ADD(dma_writeq_full);
   11893                 :          0 :         ESTAT_ADD(dma_write_prioq_full);
   11894                 :          0 :         ESTAT_ADD(rxbds_empty);
   11895                 :          0 :         ESTAT_ADD(rx_discards);
   11896                 :          0 :         ESTAT_ADD(rx_errors);
   11897                 :          0 :         ESTAT_ADD(rx_threshold_hit);
   11898                 :            : 
   11899                 :          0 :         ESTAT_ADD(dma_readq_full);
   11900                 :          0 :         ESTAT_ADD(dma_read_prioq_full);
   11901                 :          0 :         ESTAT_ADD(tx_comp_queue_full);
   11902                 :            : 
   11903                 :          0 :         ESTAT_ADD(ring_set_send_prod_index);
   11904                 :          0 :         ESTAT_ADD(ring_status_update);
   11905                 :          0 :         ESTAT_ADD(nic_irqs);
   11906                 :          0 :         ESTAT_ADD(nic_avoided_irqs);
   11907                 :          0 :         ESTAT_ADD(nic_tx_threshold_hit);
   11908                 :            : 
   11909                 :          0 :         ESTAT_ADD(mbuf_lwm_thresh_hit);
   11910                 :          0 : }
   11911                 :            : 
   11912                 :          0 : static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats)
   11913                 :            : {
   11914                 :          0 :         struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev;
   11915                 :          0 :         struct tg3_hw_stats *hw_stats = tp->hw_stats;
   11916                 :            : 
   11917                 :          0 :         stats->rx_packets = old_stats->rx_packets +
   11918                 :          0 :                 get_stat64(&hw_stats->rx_ucast_packets) +
   11919                 :          0 :                 get_stat64(&hw_stats->rx_mcast_packets) +
   11920                 :          0 :                 get_stat64(&hw_stats->rx_bcast_packets);
   11921                 :            : 
   11922                 :          0 :         stats->tx_packets = old_stats->tx_packets +
   11923                 :          0 :                 get_stat64(&hw_stats->tx_ucast_packets) +
   11924                 :          0 :                 get_stat64(&hw_stats->tx_mcast_packets) +
   11925                 :          0 :                 get_stat64(&hw_stats->tx_bcast_packets);
   11926                 :            : 
   11927                 :          0 :         stats->rx_bytes = old_stats->rx_bytes +
   11928                 :          0 :                 get_stat64(&hw_stats->rx_octets);
   11929                 :          0 :         stats->tx_bytes = old_stats->tx_bytes +
   11930                 :          0 :                 get_stat64(&hw_stats->tx_octets);
   11931                 :            : 
   11932                 :          0 :         stats->rx_errors = old_stats->rx_errors +
   11933                 :          0 :                 get_stat64(&hw_stats->rx_errors);
   11934                 :          0 :         stats->tx_errors = old_stats->tx_errors +
   11935                 :          0 :                 get_stat64(&hw_stats->tx_errors) +
   11936                 :          0 :                 get_stat64(&hw_stats->tx_mac_errors) +
   11937                 :          0 :                 get_stat64(&hw_stats->tx_carrier_sense_errors) +
   11938                 :          0 :                 get_stat64(&hw_stats->tx_discards);
   11939                 :            : 
   11940                 :          0 :         stats->multicast = old_stats->multicast +
   11941                 :          0 :                 get_stat64(&hw_stats->rx_mcast_packets);
   11942                 :          0 :         stats->collisions = old_stats->collisions +
   11943                 :          0 :                 get_stat64(&hw_stats->tx_collisions);
   11944                 :            : 
   11945                 :          0 :         stats->rx_length_errors = old_stats->rx_length_errors +
   11946                 :          0 :                 get_stat64(&hw_stats->rx_frame_too_long_errors) +
   11947                 :          0 :                 get_stat64(&hw_stats->rx_undersize_packets);
   11948                 :            : 
   11949                 :          0 :         stats->rx_frame_errors = old_stats->rx_frame_errors +
   11950                 :          0 :                 get_stat64(&hw_stats->rx_align_errors);
   11951                 :          0 :         stats->tx_aborted_errors = old_stats->tx_aborted_errors +
   11952                 :          0 :                 get_stat64(&hw_stats->tx_discards);
   11953                 :          0 :         stats->tx_carrier_errors = old_stats->tx_carrier_errors +
   11954                 :          0 :                 get_stat64(&hw_stats->tx_carrier_sense_errors);
   11955                 :            : 
   11956                 :          0 :         stats->rx_crc_errors = old_stats->rx_crc_errors +
   11957                 :          0 :                 tg3_calc_crc_errors(tp);
   11958                 :            : 
   11959                 :          0 :         stats->rx_missed_errors = old_stats->rx_missed_errors +
   11960                 :          0 :                 get_stat64(&hw_stats->rx_discards);
   11961                 :            : 
   11962                 :          0 :         stats->rx_dropped = tp->rx_dropped;
   11963                 :          0 :         stats->tx_dropped = tp->tx_dropped;
   11964                 :          0 : }
   11965                 :            : 
   11966                 :          0 : static int tg3_get_regs_len(struct net_device *dev)
   11967                 :            : {
   11968                 :          0 :         return TG3_REG_BLK_SIZE;
   11969                 :            : }
   11970                 :            : 
   11971                 :          0 : static void tg3_get_regs(struct net_device *dev,
   11972                 :            :                 struct ethtool_regs *regs, void *_p)
   11973                 :            : {
   11974         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   11975                 :            : 
   11976                 :          0 :         regs->version = 0;
   11977                 :            : 
   11978                 :          0 :         memset(_p, 0, TG3_REG_BLK_SIZE);
   11979                 :            : 
   11980         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
   11981                 :            :                 return;
   11982                 :            : 
   11983                 :          0 :         tg3_full_lock(tp, 0);
   11984                 :            : 
   11985                 :          0 :         tg3_dump_legacy_regs(tp, (u32 *)_p);
   11986                 :            : 
   11987                 :          0 :         tg3_full_unlock(tp);
   11988                 :            : }
   11989                 :            : 
   11990                 :          0 : static int tg3_get_eeprom_len(struct net_device *dev)
   11991                 :            : {
   11992                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   11993                 :            : 
   11994                 :          0 :         return tp->nvram_size;
   11995                 :            : }
   11996                 :            : 
   11997                 :          0 : static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
   11998                 :            : {
   11999                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12000                 :          0 :         int ret, cpmu_restore = 0;
   12001                 :          0 :         u8  *pd;
   12002                 :          0 :         u32 i, offset, len, b_offset, b_count, cpmu_val = 0;
   12003                 :          0 :         __be32 val;
   12004                 :            : 
   12005         [ #  # ]:          0 :         if (tg3_flag(tp, NO_NVRAM))
   12006                 :            :                 return -EINVAL;
   12007                 :            : 
   12008                 :          0 :         offset = eeprom->offset;
   12009                 :          0 :         len = eeprom->len;
   12010                 :          0 :         eeprom->len = 0;
   12011                 :            : 
   12012                 :          0 :         eeprom->magic = TG3_EEPROM_MAGIC;
   12013                 :            : 
   12014                 :            :         /* Override clock, link aware and link idle modes */
   12015         [ #  # ]:          0 :         if (tg3_flag(tp, CPMU_PRESENT)) {
   12016                 :          0 :                 cpmu_val = tr32(TG3_CPMU_CTRL);
   12017         [ #  # ]:          0 :                 if (cpmu_val & (CPMU_CTRL_LINK_AWARE_MODE |
   12018                 :            :                                 CPMU_CTRL_LINK_IDLE_MODE)) {
   12019                 :          0 :                         tw32(TG3_CPMU_CTRL, cpmu_val &
   12020                 :            :                                             ~(CPMU_CTRL_LINK_AWARE_MODE |
   12021                 :            :                                              CPMU_CTRL_LINK_IDLE_MODE));
   12022                 :          0 :                         cpmu_restore = 1;
   12023                 :            :                 }
   12024                 :            :         }
   12025                 :          0 :         tg3_override_clk(tp);
   12026                 :            : 
   12027         [ #  # ]:          0 :         if (offset & 3) {
   12028                 :            :                 /* adjustments to start on required 4 byte boundary */
   12029                 :          0 :                 b_offset = offset & 3;
   12030                 :          0 :                 b_count = 4 - b_offset;
   12031                 :          0 :                 if (b_count > len) {
   12032                 :            :                         /* i.e. offset=1 len=2 */
   12033                 :            :                         b_count = len;
   12034                 :            :                 }
   12035                 :          0 :                 ret = tg3_nvram_read_be32(tp, offset-b_offset, &val);
   12036         [ #  # ]:          0 :                 if (ret)
   12037                 :          0 :                         goto eeprom_done;
   12038                 :          0 :                 memcpy(data, ((char *)&val) + b_offset, b_count);
   12039                 :          0 :                 len -= b_count;
   12040                 :          0 :                 offset += b_count;
   12041                 :          0 :                 eeprom->len += b_count;
   12042                 :            :         }
   12043                 :            : 
   12044                 :            :         /* read bytes up to the last 4 byte boundary */
   12045                 :          0 :         pd = &data[eeprom->len];
   12046         [ #  # ]:          0 :         for (i = 0; i < (len - (len & 3)); i += 4) {
   12047                 :          0 :                 ret = tg3_nvram_read_be32(tp, offset + i, &val);
   12048         [ #  # ]:          0 :                 if (ret) {
   12049         [ #  # ]:          0 :                         if (i)
   12050                 :          0 :                                 i -= 4;
   12051                 :          0 :                         eeprom->len += i;
   12052                 :          0 :                         goto eeprom_done;
   12053                 :            :                 }
   12054                 :          0 :                 memcpy(pd + i, &val, 4);
   12055         [ #  # ]:          0 :                 if (need_resched()) {
   12056         [ #  # ]:          0 :                         if (signal_pending(current)) {
   12057                 :          0 :                                 eeprom->len += i;
   12058                 :          0 :                                 ret = -EINTR;
   12059                 :          0 :                                 goto eeprom_done;
   12060                 :            :                         }
   12061                 :          0 :                         cond_resched();
   12062                 :            :                 }
   12063                 :            :         }
   12064                 :          0 :         eeprom->len += i;
   12065                 :            : 
   12066         [ #  # ]:          0 :         if (len & 3) {
   12067                 :            :                 /* read last bytes not ending on 4 byte boundary */
   12068                 :          0 :                 pd = &data[eeprom->len];
   12069                 :          0 :                 b_count = len & 3;
   12070                 :          0 :                 b_offset = offset + len - b_count;
   12071                 :          0 :                 ret = tg3_nvram_read_be32(tp, b_offset, &val);
   12072         [ #  # ]:          0 :                 if (ret)
   12073                 :          0 :                         goto eeprom_done;
   12074                 :          0 :                 memcpy(pd, &val, b_count);
   12075                 :          0 :                 eeprom->len += b_count;
   12076                 :            :         }
   12077                 :            :         ret = 0;
   12078                 :            : 
   12079                 :          0 : eeprom_done:
   12080                 :            :         /* Restore clock, link aware and link idle modes */
   12081                 :          0 :         tg3_restore_clk(tp);
   12082         [ #  # ]:          0 :         if (cpmu_restore)
   12083                 :          0 :                 tw32(TG3_CPMU_CTRL, cpmu_val);
   12084                 :            : 
   12085                 :            :         return ret;
   12086                 :            : }
   12087                 :            : 
   12088                 :          0 : static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
   12089                 :            : {
   12090                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12091                 :          0 :         int ret;
   12092                 :          0 :         u32 offset, len, b_offset, odd_len;
   12093                 :          0 :         u8 *buf;
   12094                 :          0 :         __be32 start = 0, end;
   12095                 :            : 
   12096         [ #  # ]:          0 :         if (tg3_flag(tp, NO_NVRAM) ||
   12097         [ #  # ]:          0 :             eeprom->magic != TG3_EEPROM_MAGIC)
   12098                 :            :                 return -EINVAL;
   12099                 :            : 
   12100                 :          0 :         offset = eeprom->offset;
   12101                 :          0 :         len = eeprom->len;
   12102                 :            : 
   12103         [ #  # ]:          0 :         if ((b_offset = (offset & 3))) {
   12104                 :            :                 /* adjustments to start on required 4 byte boundary */
   12105                 :          0 :                 ret = tg3_nvram_read_be32(tp, offset-b_offset, &start);
   12106         [ #  # ]:          0 :                 if (ret)
   12107                 :            :                         return ret;
   12108                 :          0 :                 len += b_offset;
   12109                 :          0 :                 offset &= ~3;
   12110                 :          0 :                 if (len < 4)
   12111                 :            :                         len = 4;
   12112                 :            :         }
   12113                 :            : 
   12114                 :          0 :         odd_len = 0;
   12115         [ #  # ]:          0 :         if (len & 3) {
   12116                 :            :                 /* adjustments to end on required 4 byte boundary */
   12117                 :          0 :                 odd_len = 1;
   12118                 :          0 :                 len = (len + 3) & ~3;
   12119                 :          0 :                 ret = tg3_nvram_read_be32(tp, offset+len-4, &end);
   12120         [ #  # ]:          0 :                 if (ret)
   12121                 :            :                         return ret;
   12122                 :            :         }
   12123                 :            : 
   12124                 :          0 :         buf = data;
   12125         [ #  # ]:          0 :         if (b_offset || odd_len) {
   12126         [ #  # ]:          0 :                 buf = kmalloc(len, GFP_KERNEL);
   12127         [ #  # ]:          0 :                 if (!buf)
   12128                 :            :                         return -ENOMEM;
   12129         [ #  # ]:          0 :                 if (b_offset)
   12130                 :          0 :                         memcpy(buf, &start, 4);
   12131         [ #  # ]:          0 :                 if (odd_len)
   12132                 :          0 :                         memcpy(buf+len-4, &end, 4);
   12133                 :          0 :                 memcpy(buf + b_offset, data, eeprom->len);
   12134                 :            :         }
   12135                 :            : 
   12136                 :          0 :         ret = tg3_nvram_write_block(tp, offset, len, buf);
   12137                 :            : 
   12138         [ #  # ]:          0 :         if (buf != data)
   12139                 :          0 :                 kfree(buf);
   12140                 :            : 
   12141                 :            :         return ret;
   12142                 :            : }
   12143                 :            : 
   12144                 :          0 : static int tg3_get_link_ksettings(struct net_device *dev,
   12145                 :            :                                   struct ethtool_link_ksettings *cmd)
   12146                 :            : {
   12147                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12148                 :          0 :         u32 supported, advertising;
   12149                 :            : 
   12150         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB)) {
   12151                 :          0 :                 struct phy_device *phydev;
   12152         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
   12153                 :            :                         return -EAGAIN;
   12154                 :          0 :                 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
   12155                 :          0 :                 phy_ethtool_ksettings_get(phydev, cmd);
   12156                 :            : 
   12157                 :          0 :                 return 0;
   12158                 :            :         }
   12159                 :            : 
   12160                 :          0 :         supported = (SUPPORTED_Autoneg);
   12161                 :            : 
   12162         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY))
   12163                 :          0 :                 supported |= (SUPPORTED_1000baseT_Half |
   12164                 :            :                               SUPPORTED_1000baseT_Full);
   12165                 :            : 
   12166         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
   12167                 :          0 :                 supported |= (SUPPORTED_100baseT_Half |
   12168                 :            :                               SUPPORTED_100baseT_Full |
   12169                 :            :                               SUPPORTED_10baseT_Half |
   12170                 :            :                               SUPPORTED_10baseT_Full |
   12171                 :            :                               SUPPORTED_TP);
   12172                 :          0 :                 cmd->base.port = PORT_TP;
   12173                 :            :         } else {
   12174                 :          0 :                 supported |= SUPPORTED_FIBRE;
   12175                 :          0 :                 cmd->base.port = PORT_FIBRE;
   12176                 :            :         }
   12177                 :          0 :         ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
   12178                 :            :                                                 supported);
   12179                 :            : 
   12180                 :          0 :         advertising = tp->link_config.advertising;
   12181         [ #  # ]:          0 :         if (tg3_flag(tp, PAUSE_AUTONEG)) {
   12182         [ #  # ]:          0 :                 if (tp->link_config.flowctrl & FLOW_CTRL_RX) {
   12183         [ #  # ]:          0 :                         if (tp->link_config.flowctrl & FLOW_CTRL_TX) {
   12184                 :          0 :                                 advertising |= ADVERTISED_Pause;
   12185                 :            :                         } else {
   12186                 :          0 :                                 advertising |= ADVERTISED_Pause |
   12187                 :            :                                         ADVERTISED_Asym_Pause;
   12188                 :            :                         }
   12189         [ #  # ]:          0 :                 } else if (tp->link_config.flowctrl & FLOW_CTRL_TX) {
   12190                 :          0 :                         advertising |= ADVERTISED_Asym_Pause;
   12191                 :            :                 }
   12192                 :            :         }
   12193                 :          0 :         ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
   12194                 :            :                                                 advertising);
   12195                 :            : 
   12196   [ #  #  #  # ]:          0 :         if (netif_running(dev) && tp->link_up) {
   12197                 :          0 :                 cmd->base.speed = tp->link_config.active_speed;
   12198                 :          0 :                 cmd->base.duplex = tp->link_config.active_duplex;
   12199                 :          0 :                 ethtool_convert_legacy_u32_to_link_mode(
   12200                 :          0 :                         cmd->link_modes.lp_advertising,
   12201                 :            :                         tp->link_config.rmt_adv);
   12202                 :            : 
   12203         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
   12204         [ #  # ]:          0 :                         if (tp->phy_flags & TG3_PHYFLG_MDIX_STATE)
   12205                 :          0 :                                 cmd->base.eth_tp_mdix = ETH_TP_MDI_X;
   12206                 :            :                         else
   12207                 :          0 :                                 cmd->base.eth_tp_mdix = ETH_TP_MDI;
   12208                 :            :                 }
   12209                 :            :         } else {
   12210                 :          0 :                 cmd->base.speed = SPEED_UNKNOWN;
   12211                 :          0 :                 cmd->base.duplex = DUPLEX_UNKNOWN;
   12212                 :          0 :                 cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
   12213                 :            :         }
   12214                 :          0 :         cmd->base.phy_address = tp->phy_addr;
   12215                 :          0 :         cmd->base.autoneg = tp->link_config.autoneg;
   12216                 :          0 :         return 0;
   12217                 :            : }
   12218                 :            : 
   12219                 :          0 : static int tg3_set_link_ksettings(struct net_device *dev,
   12220                 :            :                                   const struct ethtool_link_ksettings *cmd)
   12221                 :            : {
   12222                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12223                 :          0 :         u32 speed = cmd->base.speed;
   12224                 :          0 :         u32 advertising;
   12225                 :            : 
   12226         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB)) {
   12227                 :          0 :                 struct phy_device *phydev;
   12228         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
   12229                 :            :                         return -EAGAIN;
   12230                 :          0 :                 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
   12231                 :          0 :                 return phy_ethtool_ksettings_set(phydev, cmd);
   12232                 :            :         }
   12233                 :            : 
   12234         [ #  # ]:          0 :         if (cmd->base.autoneg != AUTONEG_ENABLE &&
   12235                 :            :             cmd->base.autoneg != AUTONEG_DISABLE)
   12236                 :            :                 return -EINVAL;
   12237                 :            : 
   12238         [ #  # ]:          0 :         if (cmd->base.autoneg == AUTONEG_DISABLE &&
   12239   [ #  #  #  # ]:          0 :             cmd->base.duplex != DUPLEX_FULL &&
   12240                 :            :             cmd->base.duplex != DUPLEX_HALF)
   12241                 :            :                 return -EINVAL;
   12242                 :            : 
   12243                 :          0 :         ethtool_convert_link_mode_to_legacy_u32(&advertising,
   12244                 :          0 :                                                 cmd->link_modes.advertising);
   12245                 :            : 
   12246         [ #  # ]:          0 :         if (cmd->base.autoneg == AUTONEG_ENABLE) {
   12247                 :          0 :                 u32 mask = ADVERTISED_Autoneg |
   12248                 :            :                            ADVERTISED_Pause |
   12249                 :            :                            ADVERTISED_Asym_Pause;
   12250                 :            : 
   12251         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY))
   12252                 :          0 :                         mask |= ADVERTISED_1000baseT_Half |
   12253                 :            :                                 ADVERTISED_1000baseT_Full;
   12254                 :            : 
   12255         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
   12256                 :          0 :                         mask |= ADVERTISED_100baseT_Half |
   12257                 :            :                                 ADVERTISED_100baseT_Full |
   12258                 :            :                                 ADVERTISED_10baseT_Half |
   12259                 :            :                                 ADVERTISED_10baseT_Full |
   12260                 :            :                                 ADVERTISED_TP;
   12261                 :            :                 else
   12262                 :          0 :                         mask |= ADVERTISED_FIBRE;
   12263                 :            : 
   12264         [ #  # ]:          0 :                 if (advertising & ~mask)
   12265                 :            :                         return -EINVAL;
   12266                 :            : 
   12267                 :          0 :                 mask &= (ADVERTISED_1000baseT_Half |
   12268                 :            :                          ADVERTISED_1000baseT_Full |
   12269                 :            :                          ADVERTISED_100baseT_Half |
   12270                 :            :                          ADVERTISED_100baseT_Full |
   12271                 :            :                          ADVERTISED_10baseT_Half |
   12272                 :            :                          ADVERTISED_10baseT_Full);
   12273                 :            : 
   12274                 :          0 :                 advertising &= mask;
   12275                 :            :         } else {
   12276         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) {
   12277         [ #  # ]:          0 :                         if (speed != SPEED_1000)
   12278                 :            :                                 return -EINVAL;
   12279                 :            : 
   12280         [ #  # ]:          0 :                         if (cmd->base.duplex != DUPLEX_FULL)
   12281                 :            :                                 return -EINVAL;
   12282                 :            :                 } else {
   12283                 :          0 :                         if (speed != SPEED_100 &&
   12284         [ #  # ]:          0 :                             speed != SPEED_10)
   12285                 :            :                                 return -EINVAL;
   12286                 :            :                 }
   12287                 :            :         }
   12288                 :            : 
   12289                 :          0 :         tg3_full_lock(tp, 0);
   12290                 :            : 
   12291                 :          0 :         tp->link_config.autoneg = cmd->base.autoneg;
   12292         [ #  # ]:          0 :         if (cmd->base.autoneg == AUTONEG_ENABLE) {
   12293                 :          0 :                 tp->link_config.advertising = (advertising |
   12294                 :            :                                               ADVERTISED_Autoneg);
   12295                 :          0 :                 tp->link_config.speed = SPEED_UNKNOWN;
   12296                 :          0 :                 tp->link_config.duplex = DUPLEX_UNKNOWN;
   12297                 :            :         } else {
   12298                 :          0 :                 tp->link_config.advertising = 0;
   12299                 :          0 :                 tp->link_config.speed = speed;
   12300                 :          0 :                 tp->link_config.duplex = cmd->base.duplex;
   12301                 :            :         }
   12302                 :            : 
   12303                 :          0 :         tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED;
   12304                 :            : 
   12305                 :          0 :         tg3_warn_mgmt_link_flap(tp);
   12306                 :            : 
   12307         [ #  # ]:          0 :         if (netif_running(dev))
   12308                 :          0 :                 tg3_setup_phy(tp, true);
   12309                 :            : 
   12310                 :          0 :         tg3_full_unlock(tp);
   12311                 :            : 
   12312                 :          0 :         return 0;
   12313                 :            : }
   12314                 :            : 
   12315                 :          0 : static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
   12316                 :            : {
   12317                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12318                 :            : 
   12319                 :          0 :         strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
   12320                 :          0 :         strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
   12321                 :          0 :         strlcpy(info->fw_version, tp->fw_ver, sizeof(info->fw_version));
   12322         [ #  # ]:          0 :         strlcpy(info->bus_info, pci_name(tp->pdev), sizeof(info->bus_info));
   12323                 :          0 : }
   12324                 :            : 
   12325                 :          0 : static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
   12326                 :            : {
   12327                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12328                 :            : 
   12329   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, WOL_CAP) && device_can_wakeup(&tp->pdev->dev))
   12330                 :          0 :                 wol->supported = WAKE_MAGIC;
   12331                 :            :         else
   12332                 :          0 :                 wol->supported = 0;
   12333                 :          0 :         wol->wolopts = 0;
   12334   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, WOL_ENABLE) && device_can_wakeup(&tp->pdev->dev))
   12335                 :          0 :                 wol->wolopts = WAKE_MAGIC;
   12336                 :          0 :         memset(&wol->sopass, 0, sizeof(wol->sopass));
   12337                 :          0 : }
   12338                 :            : 
   12339                 :          0 : static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
   12340                 :            : {
   12341         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   12342                 :          0 :         struct device *dp = &tp->pdev->dev;
   12343                 :            : 
   12344         [ #  # ]:          0 :         if (wol->wolopts & ~WAKE_MAGIC)
   12345                 :            :                 return -EINVAL;
   12346   [ #  #  #  # ]:          0 :         if ((wol->wolopts & WAKE_MAGIC) &&
   12347         [ #  # ]:          0 :             !(tg3_flag(tp, WOL_CAP) && device_can_wakeup(dp)))
   12348                 :            :                 return -EINVAL;
   12349                 :            : 
   12350                 :          0 :         device_set_wakeup_enable(dp, wol->wolopts & WAKE_MAGIC);
   12351                 :            : 
   12352   [ #  #  #  # ]:          0 :         if (device_may_wakeup(dp))
   12353                 :          0 :                 tg3_flag_set(tp, WOL_ENABLE);
   12354                 :            :         else
   12355                 :          0 :                 tg3_flag_clear(tp, WOL_ENABLE);
   12356                 :            : 
   12357                 :            :         return 0;
   12358                 :            : }
   12359                 :            : 
   12360                 :          0 : static u32 tg3_get_msglevel(struct net_device *dev)
   12361                 :            : {
   12362                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12363                 :          0 :         return tp->msg_enable;
   12364                 :            : }
   12365                 :            : 
   12366                 :          0 : static void tg3_set_msglevel(struct net_device *dev, u32 value)
   12367                 :            : {
   12368                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12369                 :          0 :         tp->msg_enable = value;
   12370                 :          0 : }
   12371                 :            : 
   12372                 :          0 : static int tg3_nway_reset(struct net_device *dev)
   12373                 :            : {
   12374                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12375                 :          0 :         int r;
   12376                 :            : 
   12377         [ #  # ]:          0 :         if (!netif_running(dev))
   12378                 :            :                 return -EAGAIN;
   12379                 :            : 
   12380         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
   12381                 :            :                 return -EINVAL;
   12382                 :            : 
   12383                 :          0 :         tg3_warn_mgmt_link_flap(tp);
   12384                 :            : 
   12385         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB)) {
   12386         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
   12387                 :            :                         return -EAGAIN;
   12388                 :          0 :                 r = phy_start_aneg(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr));
   12389                 :            :         } else {
   12390                 :          0 :                 u32 bmcr;
   12391                 :            : 
   12392                 :          0 :                 spin_lock_bh(&tp->lock);
   12393                 :          0 :                 r = -EINVAL;
   12394                 :          0 :                 tg3_readphy(tp, MII_BMCR, &bmcr);
   12395         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_BMCR, &bmcr) &&
   12396         [ #  # ]:          0 :                     ((bmcr & BMCR_ANENABLE) ||
   12397         [ #  # ]:          0 :                      (tp->phy_flags & TG3_PHYFLG_PARALLEL_DETECT))) {
   12398                 :          0 :                         tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART |
   12399                 :            :                                                    BMCR_ANENABLE);
   12400                 :          0 :                         r = 0;
   12401                 :            :                 }
   12402                 :          0 :                 spin_unlock_bh(&tp->lock);
   12403                 :            :         }
   12404                 :            : 
   12405                 :            :         return r;
   12406                 :            : }
   12407                 :            : 
   12408                 :          0 : static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
   12409                 :            : {
   12410                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12411                 :            : 
   12412                 :          0 :         ering->rx_max_pending = tp->rx_std_ring_mask;
   12413         [ #  # ]:          0 :         if (tg3_flag(tp, JUMBO_RING_ENABLE))
   12414                 :          0 :                 ering->rx_jumbo_max_pending = tp->rx_jmb_ring_mask;
   12415                 :            :         else
   12416                 :          0 :                 ering->rx_jumbo_max_pending = 0;
   12417                 :            : 
   12418                 :          0 :         ering->tx_max_pending = TG3_TX_RING_SIZE - 1;
   12419                 :            : 
   12420                 :          0 :         ering->rx_pending = tp->rx_pending;
   12421         [ #  # ]:          0 :         if (tg3_flag(tp, JUMBO_RING_ENABLE))
   12422                 :          0 :                 ering->rx_jumbo_pending = tp->rx_jumbo_pending;
   12423                 :            :         else
   12424                 :          0 :                 ering->rx_jumbo_pending = 0;
   12425                 :            : 
   12426                 :          0 :         ering->tx_pending = tp->napi[0].tx_pending;
   12427                 :          0 : }
   12428                 :            : 
   12429                 :          0 : static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
   12430                 :            : {
   12431         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   12432                 :          0 :         int i, irq_sync = 0, err = 0;
   12433                 :          0 :         bool reset_phy = false;
   12434                 :            : 
   12435         [ #  # ]:          0 :         if ((ering->rx_pending > tp->rx_std_ring_mask) ||
   12436         [ #  # ]:          0 :             (ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) ||
   12437   [ #  #  #  # ]:          0 :             (ering->tx_pending > TG3_TX_RING_SIZE - 1) ||
   12438         [ #  # ]:          0 :             (ering->tx_pending <= MAX_SKB_FRAGS) ||
   12439                 :          0 :             (tg3_flag(tp, TSO_BUG) &&
   12440         [ #  # ]:          0 :              (ering->tx_pending <= (MAX_SKB_FRAGS * 3))))
   12441                 :          0 :                 return -EINVAL;
   12442                 :            : 
   12443         [ #  # ]:          0 :         if (netif_running(dev)) {
   12444                 :          0 :                 tg3_phy_stop(tp);
   12445                 :          0 :                 tg3_netif_stop(tp);
   12446                 :          0 :                 irq_sync = 1;
   12447                 :            :         }
   12448                 :            : 
   12449                 :          0 :         tg3_full_lock(tp, irq_sync);
   12450                 :            : 
   12451                 :          0 :         tp->rx_pending = ering->rx_pending;
   12452                 :            : 
   12453         [ #  # ]:          0 :         if (tg3_flag(tp, MAX_RXPEND_64) &&
   12454         [ #  # ]:          0 :             tp->rx_pending > 63)
   12455                 :          0 :                 tp->rx_pending = 63;
   12456                 :            : 
   12457         [ #  # ]:          0 :         if (tg3_flag(tp, JUMBO_RING_ENABLE))
   12458                 :          0 :                 tp->rx_jumbo_pending = ering->rx_jumbo_pending;
   12459                 :            : 
   12460         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++)
   12461                 :          0 :                 tp->napi[i].tx_pending = ering->tx_pending;
   12462                 :            : 
   12463         [ #  # ]:          0 :         if (netif_running(dev)) {
   12464                 :          0 :                 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   12465                 :            :                 /* Reset PHY to avoid PHY lock up */
   12466         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   12467         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5719 ||
   12468                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5720)
   12469                 :          0 :                         reset_phy = true;
   12470                 :            : 
   12471                 :          0 :                 err = tg3_restart_hw(tp, reset_phy);
   12472         [ #  # ]:          0 :                 if (!err)
   12473                 :          0 :                         tg3_netif_start(tp);
   12474                 :            :         }
   12475                 :            : 
   12476                 :          0 :         tg3_full_unlock(tp);
   12477                 :            : 
   12478         [ #  # ]:          0 :         if (irq_sync && !err)
   12479                 :          0 :                 tg3_phy_start(tp);
   12480                 :            : 
   12481                 :            :         return err;
   12482                 :            : }
   12483                 :            : 
   12484                 :          0 : static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
   12485                 :            : {
   12486                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12487                 :            : 
   12488                 :          0 :         epause->autoneg = !!tg3_flag(tp, PAUSE_AUTONEG);
   12489                 :            : 
   12490         [ #  # ]:          0 :         if (tp->link_config.flowctrl & FLOW_CTRL_RX)
   12491                 :          0 :                 epause->rx_pause = 1;
   12492                 :            :         else
   12493                 :          0 :                 epause->rx_pause = 0;
   12494                 :            : 
   12495         [ #  # ]:          0 :         if (tp->link_config.flowctrl & FLOW_CTRL_TX)
   12496                 :          0 :                 epause->tx_pause = 1;
   12497                 :            :         else
   12498                 :          0 :                 epause->tx_pause = 0;
   12499                 :          0 : }
   12500                 :            : 
   12501                 :          0 : static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
   12502                 :            : {
   12503         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   12504                 :          0 :         int err = 0;
   12505                 :          0 :         bool reset_phy = false;
   12506                 :            : 
   12507         [ #  # ]:          0 :         if (tp->link_config.autoneg == AUTONEG_ENABLE)
   12508                 :          0 :                 tg3_warn_mgmt_link_flap(tp);
   12509                 :            : 
   12510         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB)) {
   12511                 :          0 :                 struct phy_device *phydev;
   12512                 :            : 
   12513                 :          0 :                 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
   12514                 :            : 
   12515         [ #  # ]:          0 :                 if (!phy_validate_pause(phydev, epause))
   12516                 :            :                         return -EINVAL;
   12517                 :            : 
   12518                 :          0 :                 tp->link_config.flowctrl = 0;
   12519                 :          0 :                 phy_set_asym_pause(phydev, epause->rx_pause, epause->tx_pause);
   12520         [ #  # ]:          0 :                 if (epause->rx_pause) {
   12521                 :          0 :                         tp->link_config.flowctrl |= FLOW_CTRL_RX;
   12522                 :            : 
   12523         [ #  # ]:          0 :                         if (epause->tx_pause) {
   12524                 :          0 :                                 tp->link_config.flowctrl |= FLOW_CTRL_TX;
   12525                 :            :                         }
   12526         [ #  # ]:          0 :                 } else if (epause->tx_pause) {
   12527                 :          0 :                         tp->link_config.flowctrl |= FLOW_CTRL_TX;
   12528                 :            :                 }
   12529                 :            : 
   12530         [ #  # ]:          0 :                 if (epause->autoneg)
   12531                 :          0 :                         tg3_flag_set(tp, PAUSE_AUTONEG);
   12532                 :            :                 else
   12533                 :          0 :                         tg3_flag_clear(tp, PAUSE_AUTONEG);
   12534                 :            : 
   12535         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) {
   12536         [ #  # ]:          0 :                         if (phydev->autoneg) {
   12537                 :            :                                 /* phy_set_asym_pause() will
   12538                 :            :                                  * renegotiate the link to inform our
   12539                 :            :                                  * link partner of our flow control
   12540                 :            :                                  * settings, even if the flow control
   12541                 :            :                                  * is forced.  Let tg3_adjust_link()
   12542                 :            :                                  * do the final flow control setup.
   12543                 :            :                                  */
   12544                 :            :                                 return 0;
   12545                 :            :                         }
   12546                 :            : 
   12547         [ #  # ]:          0 :                         if (!epause->autoneg)
   12548                 :          0 :                                 tg3_setup_flow_control(tp, 0, 0);
   12549                 :            :                 }
   12550                 :            :         } else {
   12551                 :          0 :                 int irq_sync = 0;
   12552                 :            : 
   12553         [ #  # ]:          0 :                 if (netif_running(dev)) {
   12554                 :          0 :                         tg3_netif_stop(tp);
   12555                 :          0 :                         irq_sync = 1;
   12556                 :            :                 }
   12557                 :            : 
   12558                 :          0 :                 tg3_full_lock(tp, irq_sync);
   12559                 :            : 
   12560         [ #  # ]:          0 :                 if (epause->autoneg)
   12561                 :          0 :                         tg3_flag_set(tp, PAUSE_AUTONEG);
   12562                 :            :                 else
   12563                 :          0 :                         tg3_flag_clear(tp, PAUSE_AUTONEG);
   12564         [ #  # ]:          0 :                 if (epause->rx_pause)
   12565                 :          0 :                         tp->link_config.flowctrl |= FLOW_CTRL_RX;
   12566                 :            :                 else
   12567                 :          0 :                         tp->link_config.flowctrl &= ~FLOW_CTRL_RX;
   12568         [ #  # ]:          0 :                 if (epause->tx_pause)
   12569                 :          0 :                         tp->link_config.flowctrl |= FLOW_CTRL_TX;
   12570                 :            :                 else
   12571                 :          0 :                         tp->link_config.flowctrl &= ~FLOW_CTRL_TX;
   12572                 :            : 
   12573         [ #  # ]:          0 :                 if (netif_running(dev)) {
   12574                 :          0 :                         tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   12575                 :            :                         /* Reset PHY to avoid PHY lock up */
   12576         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   12577         [ #  # ]:          0 :                             tg3_asic_rev(tp) == ASIC_REV_5719 ||
   12578                 :            :                             tg3_asic_rev(tp) == ASIC_REV_5720)
   12579                 :          0 :                                 reset_phy = true;
   12580                 :            : 
   12581                 :          0 :                         err = tg3_restart_hw(tp, reset_phy);
   12582         [ #  # ]:          0 :                         if (!err)
   12583                 :          0 :                                 tg3_netif_start(tp);
   12584                 :            :                 }
   12585                 :            : 
   12586                 :          0 :                 tg3_full_unlock(tp);
   12587                 :            :         }
   12588                 :            : 
   12589                 :          0 :         tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED;
   12590                 :            : 
   12591                 :          0 :         return err;
   12592                 :            : }
   12593                 :            : 
   12594                 :          0 : static int tg3_get_sset_count(struct net_device *dev, int sset)
   12595                 :            : {
   12596      [ #  #  # ]:          0 :         switch (sset) {
   12597                 :            :         case ETH_SS_TEST:
   12598                 :            :                 return TG3_NUM_TEST;
   12599                 :          0 :         case ETH_SS_STATS:
   12600                 :          0 :                 return TG3_NUM_STATS;
   12601                 :          0 :         default:
   12602                 :          0 :                 return -EOPNOTSUPP;
   12603                 :            :         }
   12604                 :            : }
   12605                 :            : 
   12606                 :          0 : static int tg3_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
   12607                 :            :                          u32 *rules __always_unused)
   12608                 :            : {
   12609                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12610                 :            : 
   12611         [ #  # ]:          0 :         if (!tg3_flag(tp, SUPPORT_MSIX))
   12612                 :            :                 return -EOPNOTSUPP;
   12613                 :            : 
   12614         [ #  # ]:          0 :         switch (info->cmd) {
   12615                 :          0 :         case ETHTOOL_GRXRINGS:
   12616         [ #  # ]:          0 :                 if (netif_running(tp->dev))
   12617                 :          0 :                         info->data = tp->rxq_cnt;
   12618                 :            :                 else {
   12619                 :          0 :                         info->data = num_online_cpus();
   12620         [ #  # ]:          0 :                         if (info->data > TG3_RSS_MAX_NUM_QS)
   12621                 :          0 :                                 info->data = TG3_RSS_MAX_NUM_QS;
   12622                 :            :                 }
   12623                 :            : 
   12624                 :            :                 return 0;
   12625                 :            : 
   12626                 :            :         default:
   12627                 :            :                 return -EOPNOTSUPP;
   12628                 :            :         }
   12629                 :            : }
   12630                 :            : 
   12631                 :          0 : static u32 tg3_get_rxfh_indir_size(struct net_device *dev)
   12632                 :            : {
   12633                 :          0 :         u32 size = 0;
   12634                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12635                 :            : 
   12636         [ #  # ]:          0 :         if (tg3_flag(tp, SUPPORT_MSIX))
   12637                 :          0 :                 size = TG3_RSS_INDIR_TBL_SIZE;
   12638                 :            : 
   12639                 :          0 :         return size;
   12640                 :            : }
   12641                 :            : 
   12642                 :          0 : static int tg3_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, u8 *hfunc)
   12643                 :            : {
   12644         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   12645                 :          0 :         int i;
   12646                 :            : 
   12647         [ #  # ]:          0 :         if (hfunc)
   12648                 :          0 :                 *hfunc = ETH_RSS_HASH_TOP;
   12649         [ #  # ]:          0 :         if (!indir)
   12650                 :            :                 return 0;
   12651                 :            : 
   12652         [ #  # ]:          0 :         for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++)
   12653                 :          0 :                 indir[i] = tp->rss_ind_tbl[i];
   12654                 :            : 
   12655                 :            :         return 0;
   12656                 :            : }
   12657                 :            : 
   12658                 :          0 : static int tg3_set_rxfh(struct net_device *dev, const u32 *indir, const u8 *key,
   12659                 :            :                         const u8 hfunc)
   12660                 :            : {
   12661         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   12662                 :          0 :         size_t i;
   12663                 :            : 
   12664                 :            :         /* We require at least one supported parameter to be changed and no
   12665                 :            :          * change in any of the unsupported parameters
   12666                 :            :          */
   12667                 :          0 :         if (key ||
   12668         [ #  # ]:          0 :             (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP))
   12669                 :            :                 return -EOPNOTSUPP;
   12670                 :            : 
   12671         [ #  # ]:          0 :         if (!indir)
   12672                 :            :                 return 0;
   12673                 :            : 
   12674         [ #  # ]:          0 :         for (i = 0; i < TG3_RSS_INDIR_TBL_SIZE; i++)
   12675                 :          0 :                 tp->rss_ind_tbl[i] = indir[i];
   12676                 :            : 
   12677   [ #  #  #  # ]:          0 :         if (!netif_running(dev) || !tg3_flag(tp, ENABLE_RSS))
   12678                 :          0 :                 return 0;
   12679                 :            : 
   12680                 :            :         /* It is legal to write the indirection
   12681                 :            :          * table while the device is running.
   12682                 :            :          */
   12683                 :          0 :         tg3_full_lock(tp, 0);
   12684                 :          0 :         tg3_rss_write_indir_tbl(tp);
   12685                 :          0 :         tg3_full_unlock(tp);
   12686                 :            : 
   12687                 :          0 :         return 0;
   12688                 :            : }
   12689                 :            : 
   12690                 :          0 : static void tg3_get_channels(struct net_device *dev,
   12691                 :            :                              struct ethtool_channels *channel)
   12692                 :            : {
   12693                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12694                 :          0 :         u32 deflt_qs = netif_get_num_default_rss_queues();
   12695                 :            : 
   12696                 :          0 :         channel->max_rx = tp->rxq_max;
   12697                 :          0 :         channel->max_tx = tp->txq_max;
   12698                 :            : 
   12699         [ #  # ]:          0 :         if (netif_running(dev)) {
   12700                 :          0 :                 channel->rx_count = tp->rxq_cnt;
   12701                 :          0 :                 channel->tx_count = tp->txq_cnt;
   12702                 :            :         } else {
   12703         [ #  # ]:          0 :                 if (tp->rxq_req)
   12704                 :          0 :                         channel->rx_count = tp->rxq_req;
   12705                 :            :                 else
   12706                 :          0 :                         channel->rx_count = min(deflt_qs, tp->rxq_max);
   12707                 :            : 
   12708         [ #  # ]:          0 :                 if (tp->txq_req)
   12709                 :          0 :                         channel->tx_count = tp->txq_req;
   12710                 :            :                 else
   12711                 :          0 :                         channel->tx_count = min(deflt_qs, tp->txq_max);
   12712                 :            :         }
   12713                 :          0 : }
   12714                 :            : 
   12715                 :          0 : static int tg3_set_channels(struct net_device *dev,
   12716                 :            :                             struct ethtool_channels *channel)
   12717                 :            : {
   12718                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   12719                 :            : 
   12720         [ #  # ]:          0 :         if (!tg3_flag(tp, SUPPORT_MSIX))
   12721                 :            :                 return -EOPNOTSUPP;
   12722                 :            : 
   12723         [ #  # ]:          0 :         if (channel->rx_count > tp->rxq_max ||
   12724         [ #  # ]:          0 :             channel->tx_count > tp->txq_max)
   12725                 :            :                 return -EINVAL;
   12726                 :            : 
   12727                 :          0 :         tp->rxq_req = channel->rx_count;
   12728                 :          0 :         tp->txq_req = channel->tx_count;
   12729                 :            : 
   12730         [ #  # ]:          0 :         if (!netif_running(dev))
   12731                 :            :                 return 0;
   12732                 :            : 
   12733                 :          0 :         tg3_stop(tp);
   12734                 :            : 
   12735                 :          0 :         tg3_carrier_off(tp);
   12736                 :            : 
   12737                 :          0 :         tg3_start(tp, true, false, false);
   12738                 :            : 
   12739                 :          0 :         return 0;
   12740                 :            : }
   12741                 :            : 
   12742                 :          0 : static void tg3_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
   12743                 :            : {
   12744      [ #  #  # ]:          0 :         switch (stringset) {
   12745                 :          0 :         case ETH_SS_STATS:
   12746                 :          0 :                 memcpy(buf, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
   12747                 :          0 :                 break;
   12748                 :          0 :         case ETH_SS_TEST:
   12749                 :          0 :                 memcpy(buf, &ethtool_test_keys, sizeof(ethtool_test_keys));
   12750                 :          0 :                 break;
   12751                 :            :         default:
   12752                 :          0 :                 WARN_ON(1);     /* we need a WARN() */
   12753                 :          0 :                 break;
   12754                 :            :         }
   12755                 :          0 : }
   12756                 :            : 
   12757                 :          0 : static int tg3_set_phys_id(struct net_device *dev,
   12758                 :            :                             enum ethtool_phys_id_state state)
   12759                 :            : {
   12760   [ #  #  #  #  :          0 :         struct tg3 *tp = netdev_priv(dev);
                      # ]
   12761                 :            : 
   12762   [ #  #  #  #  :          0 :         switch (state) {
                      # ]
   12763                 :            :         case ETHTOOL_ID_ACTIVE:
   12764                 :            :                 return 1;       /* cycle on/off once per second */
   12765                 :            : 
   12766                 :          0 :         case ETHTOOL_ID_ON:
   12767                 :          0 :                 tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE |
   12768                 :            :                      LED_CTRL_1000MBPS_ON |
   12769                 :            :                      LED_CTRL_100MBPS_ON |
   12770                 :            :                      LED_CTRL_10MBPS_ON |
   12771                 :            :                      LED_CTRL_TRAFFIC_OVERRIDE |
   12772                 :            :                      LED_CTRL_TRAFFIC_BLINK |
   12773                 :            :                      LED_CTRL_TRAFFIC_LED);
   12774                 :          0 :                 break;
   12775                 :            : 
   12776                 :          0 :         case ETHTOOL_ID_OFF:
   12777                 :          0 :                 tw32(MAC_LED_CTRL, LED_CTRL_LNKLED_OVERRIDE |
   12778                 :            :                      LED_CTRL_TRAFFIC_OVERRIDE);
   12779                 :          0 :                 break;
   12780                 :            : 
   12781                 :          0 :         case ETHTOOL_ID_INACTIVE:
   12782                 :          0 :                 tw32(MAC_LED_CTRL, tp->led_ctrl);
   12783                 :          0 :                 break;
   12784                 :            :         }
   12785                 :            : 
   12786                 :            :         return 0;
   12787                 :            : }
   12788                 :            : 
   12789                 :          0 : static void tg3_get_ethtool_stats(struct net_device *dev,
   12790                 :            :                                    struct ethtool_stats *estats, u64 *tmp_stats)
   12791                 :            : {
   12792         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   12793                 :            : 
   12794         [ #  # ]:          0 :         if (tp->hw_stats)
   12795                 :          0 :                 tg3_get_estats(tp, (struct tg3_ethtool_stats *)tmp_stats);
   12796                 :            :         else
   12797                 :          0 :                 memset(tmp_stats, 0, sizeof(struct tg3_ethtool_stats));
   12798                 :          0 : }
   12799                 :            : 
   12800                 :          0 : static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen)
   12801                 :            : {
   12802                 :          0 :         int i;
   12803                 :          0 :         __be32 *buf;
   12804                 :          0 :         u32 offset = 0, len = 0;
   12805                 :          0 :         u32 magic, val;
   12806                 :            : 
   12807   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, NO_NVRAM) || tg3_nvram_read(tp, 0, &magic))
   12808                 :          0 :                 return NULL;
   12809                 :            : 
   12810         [ #  # ]:          0 :         if (magic == TG3_EEPROM_MAGIC) {
   12811                 :          0 :                 for (offset = TG3_NVM_DIR_START;
   12812         [ #  # ]:          0 :                      offset < TG3_NVM_DIR_END;
   12813                 :          0 :                      offset += TG3_NVM_DIRENT_SIZE) {
   12814         [ #  # ]:          0 :                         if (tg3_nvram_read(tp, offset, &val))
   12815                 :            :                                 return NULL;
   12816                 :            : 
   12817         [ #  # ]:          0 :                         if ((val >> TG3_NVM_DIRTYPE_SHIFT) ==
   12818                 :            :                             TG3_NVM_DIRTYPE_EXTVPD)
   12819                 :            :                                 break;
   12820                 :            :                 }
   12821                 :            : 
   12822         [ #  # ]:          0 :                 if (offset != TG3_NVM_DIR_END) {
   12823                 :          0 :                         len = (val & TG3_NVM_DIRTYPE_LENMSK) * 4;
   12824         [ #  # ]:          0 :                         if (tg3_nvram_read(tp, offset + 4, &offset))
   12825                 :            :                                 return NULL;
   12826                 :            : 
   12827                 :          0 :                         offset = tg3_nvram_logical_addr(tp, offset);
   12828                 :            :                 }
   12829                 :            :         }
   12830                 :            : 
   12831   [ #  #  #  # ]:          0 :         if (!offset || !len) {
   12832                 :          0 :                 offset = TG3_NVM_VPD_OFF;
   12833                 :          0 :                 len = TG3_NVM_VPD_LEN;
   12834                 :            :         }
   12835                 :            : 
   12836         [ #  # ]:          0 :         buf = kmalloc(len, GFP_KERNEL);
   12837         [ #  # ]:          0 :         if (buf == NULL)
   12838                 :            :                 return NULL;
   12839                 :            : 
   12840         [ #  # ]:          0 :         if (magic == TG3_EEPROM_MAGIC) {
   12841         [ #  # ]:          0 :                 for (i = 0; i < len; i += 4) {
   12842                 :            :                         /* The data is in little-endian format in NVRAM.
   12843                 :            :                          * Use the big-endian read routines to preserve
   12844                 :            :                          * the byte order as it exists in NVRAM.
   12845                 :            :                          */
   12846         [ #  # ]:          0 :                         if (tg3_nvram_read_be32(tp, offset + i, &buf[i/4]))
   12847                 :          0 :                                 goto error;
   12848                 :            :                 }
   12849                 :            :         } else {
   12850                 :            :                 u8 *ptr;
   12851                 :            :                 ssize_t cnt;
   12852                 :            :                 unsigned int pos = 0;
   12853                 :            : 
   12854                 :            :                 ptr = (u8 *)&buf[0];
   12855         [ #  # ]:          0 :                 for (i = 0; pos < len && i < 3; i++, pos += cnt, ptr += cnt) {
   12856                 :          0 :                         cnt = pci_read_vpd(tp->pdev, pos,
   12857                 :          0 :                                            len - pos, ptr);
   12858         [ #  # ]:          0 :                         if (cnt == -ETIMEDOUT || cnt == -EINTR)
   12859                 :            :                                 cnt = 0;
   12860         [ #  # ]:          0 :                         else if (cnt < 0)
   12861                 :          0 :                                 goto error;
   12862                 :            :                 }
   12863         [ #  # ]:          0 :                 if (pos != len)
   12864                 :          0 :                         goto error;
   12865                 :            :         }
   12866                 :            : 
   12867                 :          0 :         *vpdlen = len;
   12868                 :            : 
   12869                 :          0 :         return buf;
   12870                 :            : 
   12871                 :          0 : error:
   12872                 :          0 :         kfree(buf);
   12873                 :          0 :         return NULL;
   12874                 :            : }
   12875                 :            : 
   12876                 :            : #define NVRAM_TEST_SIZE 0x100
   12877                 :            : #define NVRAM_SELFBOOT_FORMAT1_0_SIZE   0x14
   12878                 :            : #define NVRAM_SELFBOOT_FORMAT1_2_SIZE   0x18
   12879                 :            : #define NVRAM_SELFBOOT_FORMAT1_3_SIZE   0x1c
   12880                 :            : #define NVRAM_SELFBOOT_FORMAT1_4_SIZE   0x20
   12881                 :            : #define NVRAM_SELFBOOT_FORMAT1_5_SIZE   0x24
   12882                 :            : #define NVRAM_SELFBOOT_FORMAT1_6_SIZE   0x50
   12883                 :            : #define NVRAM_SELFBOOT_HW_SIZE 0x20
   12884                 :            : #define NVRAM_SELFBOOT_DATA_SIZE 0x1c
   12885                 :            : 
   12886                 :          0 : static int tg3_test_nvram(struct tg3 *tp)
   12887                 :            : {
   12888                 :          0 :         u32 csum, magic, len;
   12889                 :          0 :         __be32 *buf;
   12890                 :          0 :         int i, j, k, err = 0, size;
   12891                 :            : 
   12892         [ #  # ]:          0 :         if (tg3_flag(tp, NO_NVRAM))
   12893                 :            :                 return 0;
   12894                 :            : 
   12895         [ #  # ]:          0 :         if (tg3_nvram_read(tp, 0, &magic) != 0)
   12896                 :            :                 return -EIO;
   12897                 :            : 
   12898         [ #  # ]:          0 :         if (magic == TG3_EEPROM_MAGIC)
   12899                 :            :                 size = NVRAM_TEST_SIZE;
   12900         [ #  # ]:          0 :         else if ((magic & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW) {
   12901         [ #  # ]:          0 :                 if ((magic & TG3_EEPROM_SB_FORMAT_MASK) ==
   12902                 :            :                     TG3_EEPROM_SB_FORMAT_1) {
   12903   [ #  #  #  #  :          0 :                         switch (magic & TG3_EEPROM_SB_REVISION_MASK) {
                #  #  # ]
   12904                 :            :                         case TG3_EEPROM_SB_REVISION_0:
   12905                 :            :                                 size = NVRAM_SELFBOOT_FORMAT1_0_SIZE;
   12906                 :            :                                 break;
   12907                 :          0 :                         case TG3_EEPROM_SB_REVISION_2:
   12908                 :          0 :                                 size = NVRAM_SELFBOOT_FORMAT1_2_SIZE;
   12909                 :          0 :                                 break;
   12910                 :          0 :                         case TG3_EEPROM_SB_REVISION_3:
   12911                 :          0 :                                 size = NVRAM_SELFBOOT_FORMAT1_3_SIZE;
   12912                 :          0 :                                 break;
   12913                 :          0 :                         case TG3_EEPROM_SB_REVISION_4:
   12914                 :          0 :                                 size = NVRAM_SELFBOOT_FORMAT1_4_SIZE;
   12915                 :          0 :                                 break;
   12916                 :          0 :                         case TG3_EEPROM_SB_REVISION_5:
   12917                 :          0 :                                 size = NVRAM_SELFBOOT_FORMAT1_5_SIZE;
   12918                 :          0 :                                 break;
   12919                 :          0 :                         case TG3_EEPROM_SB_REVISION_6:
   12920                 :          0 :                                 size = NVRAM_SELFBOOT_FORMAT1_6_SIZE;
   12921                 :          0 :                                 break;
   12922                 :            :                         default:
   12923                 :            :                                 return -EIO;
   12924                 :            :                         }
   12925                 :            :                 } else
   12926                 :            :                         return 0;
   12927         [ #  # ]:          0 :         } else if ((magic & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW)
   12928                 :            :                 size = NVRAM_SELFBOOT_HW_SIZE;
   12929                 :            :         else
   12930                 :            :                 return -EIO;
   12931                 :            : 
   12932         [ #  # ]:          0 :         buf = kmalloc(size, GFP_KERNEL);
   12933         [ #  # ]:          0 :         if (buf == NULL)
   12934                 :            :                 return -ENOMEM;
   12935                 :            : 
   12936                 :            :         err = -EIO;
   12937         [ #  # ]:          0 :         for (i = 0, j = 0; i < size; i += 4, j++) {
   12938                 :          0 :                 err = tg3_nvram_read_be32(tp, i, &buf[j]);
   12939         [ #  # ]:          0 :                 if (err)
   12940                 :            :                         break;
   12941                 :            :         }
   12942         [ #  # ]:          0 :         if (i < size)
   12943                 :          0 :                 goto out;
   12944                 :            : 
   12945                 :            :         /* Selfboot format */
   12946                 :          0 :         magic = be32_to_cpu(buf[0]);
   12947         [ #  # ]:          0 :         if ((magic & TG3_EEPROM_MAGIC_FW_MSK) ==
   12948                 :            :             TG3_EEPROM_MAGIC_FW) {
   12949                 :          0 :                 u8 *buf8 = (u8 *) buf, csum8 = 0;
   12950                 :            : 
   12951         [ #  # ]:          0 :                 if ((magic & TG3_EEPROM_SB_REVISION_MASK) ==
   12952                 :            :                     TG3_EEPROM_SB_REVISION_2) {
   12953                 :            :                         /* For rev 2, the csum doesn't include the MBA. */
   12954         [ #  # ]:          0 :                         for (i = 0; i < TG3_EEPROM_SB_F1R2_MBA_OFF; i++)
   12955                 :          0 :                                 csum8 += buf8[i];
   12956         [ #  # ]:          0 :                         for (i = TG3_EEPROM_SB_F1R2_MBA_OFF + 4; i < size; i++)
   12957                 :          0 :                                 csum8 += buf8[i];
   12958                 :            :                 } else {
   12959         [ #  # ]:          0 :                         for (i = 0; i < size; i++)
   12960                 :          0 :                                 csum8 += buf8[i];
   12961                 :            :                 }
   12962                 :            : 
   12963         [ #  # ]:          0 :                 if (csum8 == 0) {
   12964                 :          0 :                         err = 0;
   12965                 :          0 :                         goto out;
   12966                 :            :                 }
   12967                 :            : 
   12968                 :          0 :                 err = -EIO;
   12969                 :          0 :                 goto out;
   12970                 :            :         }
   12971                 :            : 
   12972         [ #  # ]:          0 :         if ((magic & TG3_EEPROM_MAGIC_HW_MSK) ==
   12973                 :            :             TG3_EEPROM_MAGIC_HW) {
   12974                 :            :                 u8 data[NVRAM_SELFBOOT_DATA_SIZE];
   12975                 :            :                 u8 parity[NVRAM_SELFBOOT_DATA_SIZE];
   12976                 :            :                 u8 *buf8 = (u8 *) buf;
   12977                 :            : 
   12978                 :            :                 /* Separate the parity bits and the data bytes.  */
   12979         [ #  # ]:          0 :                 for (i = 0, j = 0, k = 0; i < NVRAM_SELFBOOT_HW_SIZE; i++) {
   12980         [ #  # ]:          0 :                         if ((i == 0) || (i == 8)) {
   12981                 :            :                                 int l;
   12982                 :            :                                 u8 msk;
   12983                 :            : 
   12984         [ #  # ]:          0 :                                 for (l = 0, msk = 0x80; l < 7; l++, msk >>= 1)
   12985                 :          0 :                                         parity[k++] = buf8[i] & msk;
   12986                 :          0 :                                 i++;
   12987         [ #  # ]:          0 :                         } else if (i == 16) {
   12988                 :            :                                 int l;
   12989                 :            :                                 u8 msk;
   12990                 :            : 
   12991         [ #  # ]:          0 :                                 for (l = 0, msk = 0x20; l < 6; l++, msk >>= 1)
   12992                 :          0 :                                         parity[k++] = buf8[i] & msk;
   12993                 :            :                                 i++;
   12994                 :            : 
   12995         [ #  # ]:          0 :                                 for (l = 0, msk = 0x80; l < 8; l++, msk >>= 1)
   12996                 :          0 :                                         parity[k++] = buf8[i] & msk;
   12997                 :            :                                 i++;
   12998                 :            :                         }
   12999                 :          0 :                         data[j++] = buf8[i];
   13000                 :            :                 }
   13001                 :            : 
   13002                 :            :                 err = -EIO;
   13003         [ #  # ]:          0 :                 for (i = 0; i < NVRAM_SELFBOOT_DATA_SIZE; i++) {
   13004         [ #  # ]:          0 :                         u8 hw8 = hweight8(data[i]);
   13005                 :            : 
   13006   [ #  #  #  # ]:          0 :                         if ((hw8 & 0x1) && parity[i])
   13007                 :          0 :                                 goto out;
   13008   [ #  #  #  # ]:          0 :                         else if (!(hw8 & 0x1) && !parity[i])
   13009                 :          0 :                                 goto out;
   13010                 :            :                 }
   13011                 :          0 :                 err = 0;
   13012                 :          0 :                 goto out;
   13013                 :            :         }
   13014                 :            : 
   13015                 :            :         err = -EIO;
   13016                 :            : 
   13017                 :            :         /* Bootstrap checksum at offset 0x10 */
   13018                 :            :         csum = calc_crc((unsigned char *) buf, 0x10);
   13019         [ #  # ]:          0 :         if (csum != le32_to_cpu(buf[0x10/4]))
   13020                 :          0 :                 goto out;
   13021                 :            : 
   13022                 :            :         /* Manufacturing block starts at offset 0x74, checksum at 0xfc */
   13023                 :            :         csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88);
   13024         [ #  # ]:          0 :         if (csum != le32_to_cpu(buf[0xfc/4]))
   13025                 :          0 :                 goto out;
   13026                 :            : 
   13027                 :          0 :         kfree(buf);
   13028                 :            : 
   13029                 :          0 :         buf = tg3_vpd_readblock(tp, &len);
   13030         [ #  # ]:          0 :         if (!buf)
   13031                 :            :                 return -ENOMEM;
   13032                 :            : 
   13033                 :          0 :         i = pci_vpd_find_tag((u8 *)buf, 0, len, PCI_VPD_LRDT_RO_DATA);
   13034         [ #  # ]:          0 :         if (i > 0) {
   13035         [ #  # ]:          0 :                 j = pci_vpd_lrdt_size(&((u8 *)buf)[i]);
   13036                 :          0 :                 if (j < 0)
   13037                 :            :                         goto out;
   13038                 :            : 
   13039         [ #  # ]:          0 :                 if (i + PCI_VPD_LRDT_TAG_SIZE + j > len)
   13040                 :          0 :                         goto out;
   13041                 :            : 
   13042                 :          0 :                 i += PCI_VPD_LRDT_TAG_SIZE;
   13043                 :          0 :                 j = pci_vpd_find_info_keyword((u8 *)buf, i, j,
   13044                 :            :                                               PCI_VPD_RO_KEYWORD_CHKSUM);
   13045         [ #  # ]:          0 :                 if (j > 0) {
   13046                 :          0 :                         u8 csum8 = 0;
   13047                 :            : 
   13048                 :          0 :                         j += PCI_VPD_INFO_FLD_HDR_SIZE;
   13049                 :            : 
   13050         [ #  # ]:          0 :                         for (i = 0; i <= j; i++)
   13051                 :          0 :                                 csum8 += ((u8 *)buf)[i];
   13052                 :            : 
   13053         [ #  # ]:          0 :                         if (csum8)
   13054                 :          0 :                                 goto out;
   13055                 :            :                 }
   13056                 :            :         }
   13057                 :            : 
   13058                 :            :         err = 0;
   13059                 :            : 
   13060                 :          0 : out:
   13061                 :          0 :         kfree(buf);
   13062                 :          0 :         return err;
   13063                 :            : }
   13064                 :            : 
   13065                 :            : #define TG3_SERDES_TIMEOUT_SEC  2
   13066                 :            : #define TG3_COPPER_TIMEOUT_SEC  6
   13067                 :            : 
   13068                 :          0 : static int tg3_test_link(struct tg3 *tp)
   13069                 :            : {
   13070                 :          0 :         int i, max;
   13071                 :            : 
   13072         [ #  # ]:          0 :         if (!netif_running(tp->dev))
   13073                 :            :                 return -ENODEV;
   13074                 :            : 
   13075         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
   13076                 :            :                 max = TG3_SERDES_TIMEOUT_SEC;
   13077                 :            :         else
   13078                 :          0 :                 max = TG3_COPPER_TIMEOUT_SEC;
   13079                 :            : 
   13080         [ #  # ]:          0 :         for (i = 0; i < max; i++) {
   13081         [ #  # ]:          0 :                 if (tp->link_up)
   13082                 :            :                         return 0;
   13083                 :            : 
   13084         [ #  # ]:          0 :                 if (msleep_interruptible(1000))
   13085                 :            :                         break;
   13086                 :            :         }
   13087                 :            : 
   13088                 :            :         return -EIO;
   13089                 :            : }
   13090                 :            : 
   13091                 :            : /* Only test the commonly used registers */
   13092                 :          0 : static int tg3_test_registers(struct tg3 *tp)
   13093                 :            : {
   13094                 :          0 :         int i, is_5705, is_5750;
   13095                 :          0 :         u32 offset, read_mask, write_mask, val, save_val, read_val;
   13096                 :          0 :         static struct {
   13097                 :            :                 u16 offset;
   13098                 :            :                 u16 flags;
   13099                 :            : #define TG3_FL_5705     0x1
   13100                 :            : #define TG3_FL_NOT_5705 0x2
   13101                 :            : #define TG3_FL_NOT_5788 0x4
   13102                 :            : #define TG3_FL_NOT_5750 0x8
   13103                 :            :                 u32 read_mask;
   13104                 :            :                 u32 write_mask;
   13105                 :            :         } reg_tbl[] = {
   13106                 :            :                 /* MAC Control Registers */
   13107                 :            :                 { MAC_MODE, TG3_FL_NOT_5705,
   13108                 :            :                         0x00000000, 0x00ef6f8c },
   13109                 :            :                 { MAC_MODE, TG3_FL_5705,
   13110                 :            :                         0x00000000, 0x01ef6b8c },
   13111                 :            :                 { MAC_STATUS, TG3_FL_NOT_5705,
   13112                 :            :                         0x03800107, 0x00000000 },
   13113                 :            :                 { MAC_STATUS, TG3_FL_5705,
   13114                 :            :                         0x03800100, 0x00000000 },
   13115                 :            :                 { MAC_ADDR_0_HIGH, 0x0000,
   13116                 :            :                         0x00000000, 0x0000ffff },
   13117                 :            :                 { MAC_ADDR_0_LOW, 0x0000,
   13118                 :            :                         0x00000000, 0xffffffff },
   13119                 :            :                 { MAC_RX_MTU_SIZE, 0x0000,
   13120                 :            :                         0x00000000, 0x0000ffff },
   13121                 :            :                 { MAC_TX_MODE, 0x0000,
   13122                 :            :                         0x00000000, 0x00000070 },
   13123                 :            :                 { MAC_TX_LENGTHS, 0x0000,
   13124                 :            :                         0x00000000, 0x00003fff },
   13125                 :            :                 { MAC_RX_MODE, TG3_FL_NOT_5705,
   13126                 :            :                         0x00000000, 0x000007fc },
   13127                 :            :                 { MAC_RX_MODE, TG3_FL_5705,
   13128                 :            :                         0x00000000, 0x000007dc },
   13129                 :            :                 { MAC_HASH_REG_0, 0x0000,
   13130                 :            :                         0x00000000, 0xffffffff },
   13131                 :            :                 { MAC_HASH_REG_1, 0x0000,
   13132                 :            :                         0x00000000, 0xffffffff },
   13133                 :            :                 { MAC_HASH_REG_2, 0x0000,
   13134                 :            :                         0x00000000, 0xffffffff },
   13135                 :            :                 { MAC_HASH_REG_3, 0x0000,
   13136                 :            :                         0x00000000, 0xffffffff },
   13137                 :            : 
   13138                 :            :                 /* Receive Data and Receive BD Initiator Control Registers. */
   13139                 :            :                 { RCVDBDI_JUMBO_BD+0, TG3_FL_NOT_5705,
   13140                 :            :                         0x00000000, 0xffffffff },
   13141                 :            :                 { RCVDBDI_JUMBO_BD+4, TG3_FL_NOT_5705,
   13142                 :            :                         0x00000000, 0xffffffff },
   13143                 :            :                 { RCVDBDI_JUMBO_BD+8, TG3_FL_NOT_5705,
   13144                 :            :                         0x00000000, 0x00000003 },
   13145                 :            :                 { RCVDBDI_JUMBO_BD+0xc, TG3_FL_NOT_5705,
   13146                 :            :                         0x00000000, 0xffffffff },
   13147                 :            :                 { RCVDBDI_STD_BD+0, 0x0000,
   13148                 :            :                         0x00000000, 0xffffffff },
   13149                 :            :                 { RCVDBDI_STD_BD+4, 0x0000,
   13150                 :            :                         0x00000000, 0xffffffff },
   13151                 :            :                 { RCVDBDI_STD_BD+8, 0x0000,
   13152                 :            :                         0x00000000, 0xffff0002 },
   13153                 :            :                 { RCVDBDI_STD_BD+0xc, 0x0000,
   13154                 :            :                         0x00000000, 0xffffffff },
   13155                 :            : 
   13156                 :            :                 /* Receive BD Initiator Control Registers. */
   13157                 :            :                 { RCVBDI_STD_THRESH, TG3_FL_NOT_5705,
   13158                 :            :                         0x00000000, 0xffffffff },
   13159                 :            :                 { RCVBDI_STD_THRESH, TG3_FL_5705,
   13160                 :            :                         0x00000000, 0x000003ff },
   13161                 :            :                 { RCVBDI_JUMBO_THRESH, TG3_FL_NOT_5705,
   13162                 :            :                         0x00000000, 0xffffffff },
   13163                 :            : 
   13164                 :            :                 /* Host Coalescing Control Registers. */
   13165                 :            :                 { HOSTCC_MODE, TG3_FL_NOT_5705,
   13166                 :            :                         0x00000000, 0x00000004 },
   13167                 :            :                 { HOSTCC_MODE, TG3_FL_5705,
   13168                 :            :                         0x00000000, 0x000000f6 },
   13169                 :            :                 { HOSTCC_RXCOL_TICKS, TG3_FL_NOT_5705,
   13170                 :            :                         0x00000000, 0xffffffff },
   13171                 :            :                 { HOSTCC_RXCOL_TICKS, TG3_FL_5705,
   13172                 :            :                         0x00000000, 0x000003ff },
   13173                 :            :                 { HOSTCC_TXCOL_TICKS, TG3_FL_NOT_5705,
   13174                 :            :                         0x00000000, 0xffffffff },
   13175                 :            :                 { HOSTCC_TXCOL_TICKS, TG3_FL_5705,
   13176                 :            :                         0x00000000, 0x000003ff },
   13177                 :            :                 { HOSTCC_RXMAX_FRAMES, TG3_FL_NOT_5705,
   13178                 :            :                         0x00000000, 0xffffffff },
   13179                 :            :                 { HOSTCC_RXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
   13180                 :            :                         0x00000000, 0x000000ff },
   13181                 :            :                 { HOSTCC_TXMAX_FRAMES, TG3_FL_NOT_5705,
   13182                 :            :                         0x00000000, 0xffffffff },
   13183                 :            :                 { HOSTCC_TXMAX_FRAMES, TG3_FL_5705 | TG3_FL_NOT_5788,
   13184                 :            :                         0x00000000, 0x000000ff },
   13185                 :            :                 { HOSTCC_RXCOAL_TICK_INT, TG3_FL_NOT_5705,
   13186                 :            :                         0x00000000, 0xffffffff },
   13187                 :            :                 { HOSTCC_TXCOAL_TICK_INT, TG3_FL_NOT_5705,
   13188                 :            :                         0x00000000, 0xffffffff },
   13189                 :            :                 { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_NOT_5705,
   13190                 :            :                         0x00000000, 0xffffffff },
   13191                 :            :                 { HOSTCC_RXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
   13192                 :            :                         0x00000000, 0x000000ff },
   13193                 :            :                 { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_NOT_5705,
   13194                 :            :                         0x00000000, 0xffffffff },
   13195                 :            :                 { HOSTCC_TXCOAL_MAXF_INT, TG3_FL_5705 | TG3_FL_NOT_5788,
   13196                 :            :                         0x00000000, 0x000000ff },
   13197                 :            :                 { HOSTCC_STAT_COAL_TICKS, TG3_FL_NOT_5705,
   13198                 :            :                         0x00000000, 0xffffffff },
   13199                 :            :                 { HOSTCC_STATS_BLK_HOST_ADDR, TG3_FL_NOT_5705,
   13200                 :            :                         0x00000000, 0xffffffff },
   13201                 :            :                 { HOSTCC_STATS_BLK_HOST_ADDR+4, TG3_FL_NOT_5705,
   13202                 :            :                         0x00000000, 0xffffffff },
   13203                 :            :                 { HOSTCC_STATUS_BLK_HOST_ADDR, 0x0000,
   13204                 :            :                         0x00000000, 0xffffffff },
   13205                 :            :                 { HOSTCC_STATUS_BLK_HOST_ADDR+4, 0x0000,
   13206                 :            :                         0x00000000, 0xffffffff },
   13207                 :            :                 { HOSTCC_STATS_BLK_NIC_ADDR, 0x0000,
   13208                 :            :                         0xffffffff, 0x00000000 },
   13209                 :            :                 { HOSTCC_STATUS_BLK_NIC_ADDR, 0x0000,
   13210                 :            :                         0xffffffff, 0x00000000 },
   13211                 :            : 
   13212                 :            :                 /* Buffer Manager Control Registers. */
   13213                 :            :                 { BUFMGR_MB_POOL_ADDR, TG3_FL_NOT_5750,
   13214                 :            :                         0x00000000, 0x007fff80 },
   13215                 :            :                 { BUFMGR_MB_POOL_SIZE, TG3_FL_NOT_5750,
   13216                 :            :                         0x00000000, 0x007fffff },
   13217                 :            :                 { BUFMGR_MB_RDMA_LOW_WATER, 0x0000,
   13218                 :            :                         0x00000000, 0x0000003f },
   13219                 :            :                 { BUFMGR_MB_MACRX_LOW_WATER, 0x0000,
   13220                 :            :                         0x00000000, 0x000001ff },
   13221                 :            :                 { BUFMGR_MB_HIGH_WATER, 0x0000,
   13222                 :            :                         0x00000000, 0x000001ff },
   13223                 :            :                 { BUFMGR_DMA_DESC_POOL_ADDR, TG3_FL_NOT_5705,
   13224                 :            :                         0xffffffff, 0x00000000 },
   13225                 :            :                 { BUFMGR_DMA_DESC_POOL_SIZE, TG3_FL_NOT_5705,
   13226                 :            :                         0xffffffff, 0x00000000 },
   13227                 :            : 
   13228                 :            :                 /* Mailbox Registers */
   13229                 :            :                 { GRCMBOX_RCVSTD_PROD_IDX+4, 0x0000,
   13230                 :            :                         0x00000000, 0x000001ff },
   13231                 :            :                 { GRCMBOX_RCVJUMBO_PROD_IDX+4, TG3_FL_NOT_5705,
   13232                 :            :                         0x00000000, 0x000001ff },
   13233                 :            :                 { GRCMBOX_RCVRET_CON_IDX_0+4, 0x0000,
   13234                 :            :                         0x00000000, 0x000007ff },
   13235                 :            :                 { GRCMBOX_SNDHOST_PROD_IDX_0+4, 0x0000,
   13236                 :            :                         0x00000000, 0x000001ff },
   13237                 :            : 
   13238                 :            :                 { 0xffff, 0x0000, 0x00000000, 0x00000000 },
   13239                 :            :         };
   13240                 :            : 
   13241                 :          0 :         is_5705 = is_5750 = 0;
   13242         [ #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS)) {
   13243                 :          0 :                 is_5705 = 1;
   13244         [ #  # ]:          0 :                 if (tg3_flag(tp, 5750_PLUS))
   13245                 :          0 :                         is_5750 = 1;
   13246                 :            :         }
   13247                 :            : 
   13248         [ #  # ]:          0 :         for (i = 0; reg_tbl[i].offset != 0xffff; i++) {
   13249   [ #  #  #  # ]:          0 :                 if (is_5705 && (reg_tbl[i].flags & TG3_FL_NOT_5705))
   13250                 :          0 :                         continue;
   13251                 :            : 
   13252   [ #  #  #  # ]:          0 :                 if (!is_5705 && (reg_tbl[i].flags & TG3_FL_5705))
   13253                 :          0 :                         continue;
   13254                 :            : 
   13255         [ #  # ]:          0 :                 if (tg3_flag(tp, IS_5788) &&
   13256         [ #  # ]:          0 :                     (reg_tbl[i].flags & TG3_FL_NOT_5788))
   13257                 :          0 :                         continue;
   13258                 :            : 
   13259   [ #  #  #  # ]:          0 :                 if (is_5750 && (reg_tbl[i].flags & TG3_FL_NOT_5750))
   13260                 :          0 :                         continue;
   13261                 :            : 
   13262                 :          0 :                 offset = (u32) reg_tbl[i].offset;
   13263                 :          0 :                 read_mask = reg_tbl[i].read_mask;
   13264                 :          0 :                 write_mask = reg_tbl[i].write_mask;
   13265                 :            : 
   13266                 :            :                 /* Save the original register content */
   13267                 :          0 :                 save_val = tr32(offset);
   13268                 :            : 
   13269                 :            :                 /* Determine the read-only value. */
   13270                 :          0 :                 read_val = save_val & read_mask;
   13271                 :            : 
   13272                 :            :                 /* Write zero to the register, then make sure the read-only bits
   13273                 :            :                  * are not changed and the read/write bits are all zeros.
   13274                 :            :                  */
   13275                 :          0 :                 tw32(offset, 0);
   13276                 :            : 
   13277                 :          0 :                 val = tr32(offset);
   13278                 :            : 
   13279                 :            :                 /* Test the read-only and read/write bits. */
   13280   [ #  #  #  # ]:          0 :                 if (((val & read_mask) != read_val) || (val & write_mask))
   13281                 :          0 :                         goto out;
   13282                 :            : 
   13283                 :            :                 /* Write ones to all the bits defined by RdMask and WrMask, then
   13284                 :            :                  * make sure the read-only bits are not changed and the
   13285                 :            :                  * read/write bits are all ones.
   13286                 :            :                  */
   13287                 :          0 :                 tw32(offset, read_mask | write_mask);
   13288                 :            : 
   13289                 :          0 :                 val = tr32(offset);
   13290                 :            : 
   13291                 :            :                 /* Test the read-only bits. */
   13292         [ #  # ]:          0 :                 if ((val & read_mask) != read_val)
   13293                 :          0 :                         goto out;
   13294                 :            : 
   13295                 :            :                 /* Test the read/write bits. */
   13296         [ #  # ]:          0 :                 if ((val & write_mask) != write_mask)
   13297                 :          0 :                         goto out;
   13298                 :            : 
   13299                 :          0 :                 tw32(offset, save_val);
   13300                 :            :         }
   13301                 :            : 
   13302                 :            :         return 0;
   13303                 :            : 
   13304                 :          0 : out:
   13305         [ #  # ]:          0 :         if (netif_msg_hw(tp))
   13306                 :          0 :                 netdev_err(tp->dev,
   13307                 :            :                            "Register test failed at offset %x\n", offset);
   13308                 :          0 :         tw32(offset, save_val);
   13309                 :          0 :         return -EIO;
   13310                 :            : }
   13311                 :            : 
   13312                 :          0 : static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len)
   13313                 :            : {
   13314                 :          0 :         static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a };
   13315                 :          0 :         int i;
   13316                 :          0 :         u32 j;
   13317                 :            : 
   13318         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(test_pattern); i++) {
   13319         [ #  # ]:          0 :                 for (j = 0; j < len; j += 4) {
   13320                 :          0 :                         u32 val;
   13321                 :            : 
   13322                 :          0 :                         tg3_write_mem(tp, offset + j, test_pattern[i]);
   13323                 :          0 :                         tg3_read_mem(tp, offset + j, &val);
   13324         [ #  # ]:          0 :                         if (val != test_pattern[i])
   13325                 :          0 :                                 return -EIO;
   13326                 :            :                 }
   13327                 :            :         }
   13328                 :            :         return 0;
   13329                 :            : }
   13330                 :            : 
   13331                 :          0 : static int tg3_test_memory(struct tg3 *tp)
   13332                 :            : {
   13333                 :          0 :         static struct mem_entry {
   13334                 :            :                 u32 offset;
   13335                 :            :                 u32 len;
   13336                 :            :         } mem_tbl_570x[] = {
   13337                 :            :                 { 0x00000000, 0x00b50},
   13338                 :            :                 { 0x00002000, 0x1c000},
   13339                 :            :                 { 0xffffffff, 0x00000}
   13340                 :            :         }, mem_tbl_5705[] = {
   13341                 :            :                 { 0x00000100, 0x0000c},
   13342                 :            :                 { 0x00000200, 0x00008},
   13343                 :            :                 { 0x00004000, 0x00800},
   13344                 :            :                 { 0x00006000, 0x01000},
   13345                 :            :                 { 0x00008000, 0x02000},
   13346                 :            :                 { 0x00010000, 0x0e000},
   13347                 :            :                 { 0xffffffff, 0x00000}
   13348                 :            :         }, mem_tbl_5755[] = {
   13349                 :            :                 { 0x00000200, 0x00008},
   13350                 :            :                 { 0x00004000, 0x00800},
   13351                 :            :                 { 0x00006000, 0x00800},
   13352                 :            :                 { 0x00008000, 0x02000},
   13353                 :            :                 { 0x00010000, 0x0c000},
   13354                 :            :                 { 0xffffffff, 0x00000}
   13355                 :            :         }, mem_tbl_5906[] = {
   13356                 :            :                 { 0x00000200, 0x00008},
   13357                 :            :                 { 0x00004000, 0x00400},
   13358                 :            :                 { 0x00006000, 0x00400},
   13359                 :            :                 { 0x00008000, 0x01000},
   13360                 :            :                 { 0x00010000, 0x01000},
   13361                 :            :                 { 0xffffffff, 0x00000}
   13362                 :            :         }, mem_tbl_5717[] = {
   13363                 :            :                 { 0x00000200, 0x00008},
   13364                 :            :                 { 0x00010000, 0x0a000},
   13365                 :            :                 { 0x00020000, 0x13c00},
   13366                 :            :                 { 0xffffffff, 0x00000}
   13367                 :            :         }, mem_tbl_57765[] = {
   13368                 :            :                 { 0x00000200, 0x00008},
   13369                 :            :                 { 0x00004000, 0x00800},
   13370                 :            :                 { 0x00006000, 0x09800},
   13371                 :            :                 { 0x00010000, 0x0a000},
   13372                 :            :                 { 0xffffffff, 0x00000}
   13373                 :            :         };
   13374                 :          0 :         struct mem_entry *mem_tbl;
   13375                 :          0 :         int err = 0;
   13376                 :          0 :         int i;
   13377                 :            : 
   13378         [ #  # ]:          0 :         if (tg3_flag(tp, 5717_PLUS))
   13379                 :            :                 mem_tbl = mem_tbl_5717;
   13380         [ #  # ]:          0 :         else if (tg3_flag(tp, 57765_CLASS) ||
   13381         [ #  # ]:          0 :                  tg3_asic_rev(tp) == ASIC_REV_5762)
   13382                 :            :                 mem_tbl = mem_tbl_57765;
   13383         [ #  # ]:          0 :         else if (tg3_flag(tp, 5755_PLUS))
   13384                 :            :                 mem_tbl = mem_tbl_5755;
   13385         [ #  # ]:          0 :         else if (tg3_asic_rev(tp) == ASIC_REV_5906)
   13386                 :            :                 mem_tbl = mem_tbl_5906;
   13387         [ #  # ]:          0 :         else if (tg3_flag(tp, 5705_PLUS))
   13388                 :            :                 mem_tbl = mem_tbl_5705;
   13389                 :            :         else
   13390                 :          0 :                 mem_tbl = mem_tbl_570x;
   13391                 :            : 
   13392         [ #  # ]:          0 :         for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
   13393                 :          0 :                 err = tg3_do_mem_test(tp, mem_tbl[i].offset, mem_tbl[i].len);
   13394         [ #  # ]:          0 :                 if (err)
   13395                 :            :                         break;
   13396                 :            :         }
   13397                 :            : 
   13398                 :          0 :         return err;
   13399                 :            : }
   13400                 :            : 
   13401                 :            : #define TG3_TSO_MSS             500
   13402                 :            : 
   13403                 :            : #define TG3_TSO_IP_HDR_LEN      20
   13404                 :            : #define TG3_TSO_TCP_HDR_LEN     20
   13405                 :            : #define TG3_TSO_TCP_OPT_LEN     12
   13406                 :            : 
   13407                 :            : static const u8 tg3_tso_header[] = {
   13408                 :            : 0x08, 0x00,
   13409                 :            : 0x45, 0x00, 0x00, 0x00,
   13410                 :            : 0x00, 0x00, 0x40, 0x00,
   13411                 :            : 0x40, 0x06, 0x00, 0x00,
   13412                 :            : 0x0a, 0x00, 0x00, 0x01,
   13413                 :            : 0x0a, 0x00, 0x00, 0x02,
   13414                 :            : 0x0d, 0x00, 0xe0, 0x00,
   13415                 :            : 0x00, 0x00, 0x01, 0x00,
   13416                 :            : 0x00, 0x00, 0x02, 0x00,
   13417                 :            : 0x80, 0x10, 0x10, 0x00,
   13418                 :            : 0x14, 0x09, 0x00, 0x00,
   13419                 :            : 0x01, 0x01, 0x08, 0x0a,
   13420                 :            : 0x11, 0x11, 0x11, 0x11,
   13421                 :            : 0x11, 0x11, 0x11, 0x11,
   13422                 :            : };
   13423                 :            : 
   13424                 :          0 : static int tg3_run_loopback(struct tg3 *tp, u32 pktsz, bool tso_loopback)
   13425                 :            : {
   13426                 :          0 :         u32 rx_start_idx, rx_idx, tx_idx, opaque_key;
   13427                 :          0 :         u32 base_flags = 0, mss = 0, desc_idx, coal_now, data_off, val;
   13428                 :          0 :         u32 budget;
   13429                 :          0 :         struct sk_buff *skb;
   13430                 :          0 :         u8 *tx_data, *rx_data;
   13431                 :          0 :         dma_addr_t map;
   13432                 :          0 :         int num_pkts, tx_len, rx_len, i, err;
   13433                 :          0 :         struct tg3_rx_buffer_desc *desc;
   13434                 :          0 :         struct tg3_napi *tnapi, *rnapi;
   13435                 :          0 :         struct tg3_rx_prodring_set *tpr = &tp->napi[0].prodring;
   13436                 :            : 
   13437                 :          0 :         tnapi = &tp->napi[0];
   13438                 :          0 :         rnapi = &tp->napi[0];
   13439         [ #  # ]:          0 :         if (tp->irq_cnt > 1) {
   13440         [ #  # ]:          0 :                 if (tg3_flag(tp, ENABLE_RSS))
   13441                 :          0 :                         rnapi = &tp->napi[1];
   13442         [ #  # ]:          0 :                 if (tg3_flag(tp, ENABLE_TSS))
   13443                 :          0 :                         tnapi = &tp->napi[1];
   13444                 :            :         }
   13445                 :          0 :         coal_now = tnapi->coal_now | rnapi->coal_now;
   13446                 :            : 
   13447                 :          0 :         err = -EIO;
   13448                 :            : 
   13449                 :          0 :         tx_len = pktsz;
   13450                 :          0 :         skb = netdev_alloc_skb(tp->dev, tx_len);
   13451         [ #  # ]:          0 :         if (!skb)
   13452                 :            :                 return -ENOMEM;
   13453                 :            : 
   13454                 :          0 :         tx_data = skb_put(skb, tx_len);
   13455                 :          0 :         memcpy(tx_data, tp->dev->dev_addr, ETH_ALEN);
   13456                 :          0 :         memset(tx_data + ETH_ALEN, 0x0, 8);
   13457                 :            : 
   13458                 :          0 :         tw32(MAC_RX_MTU_SIZE, tx_len + ETH_FCS_LEN);
   13459                 :            : 
   13460         [ #  # ]:          0 :         if (tso_loopback) {
   13461                 :          0 :                 struct iphdr *iph = (struct iphdr *)&tx_data[ETH_HLEN];
   13462                 :            : 
   13463                 :          0 :                 u32 hdr_len = TG3_TSO_IP_HDR_LEN + TG3_TSO_TCP_HDR_LEN +
   13464                 :            :                               TG3_TSO_TCP_OPT_LEN;
   13465                 :            : 
   13466                 :          0 :                 memcpy(tx_data + ETH_ALEN * 2, tg3_tso_header,
   13467                 :            :                        sizeof(tg3_tso_header));
   13468                 :          0 :                 mss = TG3_TSO_MSS;
   13469                 :            : 
   13470                 :          0 :                 val = tx_len - ETH_ALEN * 2 - sizeof(tg3_tso_header);
   13471                 :          0 :                 num_pkts = DIV_ROUND_UP(val, TG3_TSO_MSS);
   13472                 :            : 
   13473                 :            :                 /* Set the total length field in the IP header */
   13474                 :          0 :                 iph->tot_len = htons((u16)(mss + hdr_len));
   13475                 :            : 
   13476                 :          0 :                 base_flags = (TXD_FLAG_CPU_PRE_DMA |
   13477                 :            :                               TXD_FLAG_CPU_POST_DMA);
   13478                 :            : 
   13479   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, HW_TSO_1) ||
   13480         [ #  # ]:          0 :                     tg3_flag(tp, HW_TSO_2) ||
   13481                 :          0 :                     tg3_flag(tp, HW_TSO_3)) {
   13482                 :          0 :                         struct tcphdr *th;
   13483                 :          0 :                         val = ETH_HLEN + TG3_TSO_IP_HDR_LEN;
   13484                 :          0 :                         th = (struct tcphdr *)&tx_data[val];
   13485                 :          0 :                         th->check = 0;
   13486                 :            :                 } else
   13487                 :            :                         base_flags |= TXD_FLAG_TCPUDP_CSUM;
   13488                 :            : 
   13489         [ #  # ]:          0 :                 if (tg3_flag(tp, HW_TSO_3)) {
   13490                 :          0 :                         mss |= (hdr_len & 0xc) << 12;
   13491                 :          0 :                         if (hdr_len & 0x10)
   13492                 :          0 :                                 base_flags |= 0x00000010;
   13493                 :          0 :                         base_flags |= (hdr_len & 0x3e0) << 5;
   13494         [ #  # ]:          0 :                 } else if (tg3_flag(tp, HW_TSO_2))
   13495                 :            :                         mss |= hdr_len << 9;
   13496         [ #  # ]:          0 :                 else if (tg3_flag(tp, HW_TSO_1) ||
   13497         [ #  # ]:          0 :                          tg3_asic_rev(tp) == ASIC_REV_5705) {
   13498                 :            :                         mss |= (TG3_TSO_TCP_OPT_LEN << 9);
   13499                 :            :                 } else {
   13500                 :          0 :                         base_flags |= (TG3_TSO_TCP_OPT_LEN << 10);
   13501                 :            :                 }
   13502                 :            : 
   13503                 :            :                 data_off = ETH_ALEN * 2 + sizeof(tg3_tso_header);
   13504                 :            :         } else {
   13505                 :          0 :                 num_pkts = 1;
   13506                 :          0 :                 data_off = ETH_HLEN;
   13507                 :            : 
   13508   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&
   13509                 :            :                     tx_len > VLAN_ETH_FRAME_LEN)
   13510                 :          0 :                         base_flags |= TXD_FLAG_JMB_PKT;
   13511                 :            :         }
   13512                 :            : 
   13513         [ #  # ]:          0 :         for (i = data_off; i < tx_len; i++)
   13514                 :          0 :                 tx_data[i] = (u8) (i & 0xff);
   13515                 :            : 
   13516                 :          0 :         map = pci_map_single(tp->pdev, skb->data, tx_len, PCI_DMA_TODEVICE);
   13517                 :          0 :         if (pci_dma_mapping_error(tp->pdev, map)) {
   13518                 :          0 :                 dev_kfree_skb(skb);
   13519                 :          0 :                 return -EIO;
   13520                 :            :         }
   13521                 :            : 
   13522                 :          0 :         val = tnapi->tx_prod;
   13523                 :          0 :         tnapi->tx_buffers[val].skb = skb;
   13524                 :          0 :         dma_unmap_addr_set(&tnapi->tx_buffers[val], mapping, map);
   13525                 :            : 
   13526                 :          0 :         tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
   13527                 :            :                rnapi->coal_now);
   13528                 :            : 
   13529                 :          0 :         udelay(10);
   13530                 :            : 
   13531                 :          0 :         rx_start_idx = rnapi->hw_status->idx[0].rx_producer;
   13532                 :            : 
   13533                 :          0 :         budget = tg3_tx_avail(tnapi);
   13534         [ #  # ]:          0 :         if (tg3_tx_frag_set(tnapi, &val, &budget, map, tx_len,
   13535                 :            :                             base_flags | TXD_FLAG_END, mss, 0)) {
   13536                 :          0 :                 tnapi->tx_buffers[val].skb = NULL;
   13537                 :          0 :                 dev_kfree_skb(skb);
   13538                 :          0 :                 return -EIO;
   13539                 :            :         }
   13540                 :            : 
   13541                 :          0 :         tnapi->tx_prod++;
   13542                 :            : 
   13543                 :            :         /* Sync BD data before updating mailbox */
   13544                 :          0 :         wmb();
   13545                 :            : 
   13546                 :          0 :         tw32_tx_mbox(tnapi->prodmbox, tnapi->tx_prod);
   13547                 :          0 :         tr32_mailbox(tnapi->prodmbox);
   13548                 :            : 
   13549                 :          0 :         udelay(10);
   13550                 :            : 
   13551                 :            :         /* 350 usec to allow enough time on some 10/100 Mbps devices.  */
   13552         [ #  # ]:          0 :         for (i = 0; i < 35; i++) {
   13553                 :          0 :                 tw32_f(HOSTCC_MODE, tp->coalesce_mode | HOSTCC_MODE_ENABLE |
   13554                 :            :                        coal_now);
   13555                 :            : 
   13556                 :          0 :                 udelay(10);
   13557                 :            : 
   13558                 :          0 :                 tx_idx = tnapi->hw_status->idx[0].tx_consumer;
   13559                 :          0 :                 rx_idx = rnapi->hw_status->idx[0].rx_producer;
   13560         [ #  # ]:          0 :                 if ((tx_idx == tnapi->tx_prod) &&
   13561         [ #  # ]:          0 :                     (rx_idx == (rx_start_idx + num_pkts)))
   13562                 :            :                         break;
   13563                 :            :         }
   13564                 :            : 
   13565                 :          0 :         tg3_tx_skb_unmap(tnapi, tnapi->tx_prod - 1, -1);
   13566                 :          0 :         dev_kfree_skb(skb);
   13567                 :            : 
   13568         [ #  # ]:          0 :         if (tx_idx != tnapi->tx_prod)
   13569                 :          0 :                 goto out;
   13570                 :            : 
   13571         [ #  # ]:          0 :         if (rx_idx != rx_start_idx + num_pkts)
   13572                 :          0 :                 goto out;
   13573                 :            : 
   13574                 :          0 :         val = data_off;
   13575         [ #  # ]:          0 :         while (rx_idx != rx_start_idx) {
   13576                 :          0 :                 desc = &rnapi->rx_rcb[rx_start_idx++];
   13577                 :          0 :                 desc_idx = desc->opaque & RXD_OPAQUE_INDEX_MASK;
   13578                 :          0 :                 opaque_key = desc->opaque & RXD_OPAQUE_RING_MASK;
   13579                 :            : 
   13580   [ #  #  #  # ]:          0 :                 if ((desc->err_vlan & RXD_ERR_MASK) != 0 &&
   13581                 :            :                     (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII))
   13582                 :          0 :                         goto out;
   13583                 :            : 
   13584                 :          0 :                 rx_len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT)
   13585                 :          0 :                          - ETH_FCS_LEN;
   13586                 :            : 
   13587         [ #  # ]:          0 :                 if (!tso_loopback) {
   13588         [ #  # ]:          0 :                         if (rx_len != tx_len)
   13589                 :          0 :                                 goto out;
   13590                 :            : 
   13591         [ #  # ]:          0 :                         if (pktsz <= TG3_RX_STD_DMA_SZ - ETH_FCS_LEN) {
   13592         [ #  # ]:          0 :                                 if (opaque_key != RXD_OPAQUE_RING_STD)
   13593                 :          0 :                                         goto out;
   13594                 :            :                         } else {
   13595         [ #  # ]:          0 :                                 if (opaque_key != RXD_OPAQUE_RING_JUMBO)
   13596                 :          0 :                                         goto out;
   13597                 :            :                         }
   13598         [ #  # ]:          0 :                 } else if ((desc->type_flags & RXD_FLAG_TCPUDP_CSUM) &&
   13599                 :          0 :                            (desc->ip_tcp_csum & RXD_TCPCSUM_MASK)
   13600         [ #  # ]:          0 :                             >> RXD_TCPCSUM_SHIFT != 0xffff) {
   13601                 :          0 :                         goto out;
   13602                 :            :                 }
   13603                 :            : 
   13604         [ #  # ]:          0 :                 if (opaque_key == RXD_OPAQUE_RING_STD) {
   13605                 :          0 :                         rx_data = tpr->rx_std_buffers[desc_idx].data;
   13606                 :          0 :                         map = dma_unmap_addr(&tpr->rx_std_buffers[desc_idx],
   13607                 :            :                                              mapping);
   13608         [ #  # ]:          0 :                 } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
   13609                 :          0 :                         rx_data = tpr->rx_jmb_buffers[desc_idx].data;
   13610                 :          0 :                         map = dma_unmap_addr(&tpr->rx_jmb_buffers[desc_idx],
   13611                 :            :                                              mapping);
   13612                 :            :                 } else
   13613                 :          0 :                         goto out;
   13614                 :            : 
   13615                 :          0 :                 pci_dma_sync_single_for_cpu(tp->pdev, map, rx_len,
   13616                 :            :                                             PCI_DMA_FROMDEVICE);
   13617                 :            : 
   13618                 :          0 :                 rx_data += TG3_RX_OFFSET(tp);
   13619         [ #  # ]:          0 :                 for (i = data_off; i < rx_len; i++, val++) {
   13620         [ #  # ]:          0 :                         if (*(rx_data + i) != (u8) (val & 0xff))
   13621                 :          0 :                                 goto out;
   13622                 :            :                 }
   13623                 :            :         }
   13624                 :            : 
   13625                 :            :         err = 0;
   13626                 :            : 
   13627                 :            :         /* tg3_free_rings will unmap and free the rx_data */
   13628                 :            : out:
   13629                 :            :         return err;
   13630                 :            : }
   13631                 :            : 
   13632                 :            : #define TG3_STD_LOOPBACK_FAILED         1
   13633                 :            : #define TG3_JMB_LOOPBACK_FAILED         2
   13634                 :            : #define TG3_TSO_LOOPBACK_FAILED         4
   13635                 :            : #define TG3_LOOPBACK_FAILED \
   13636                 :            :         (TG3_STD_LOOPBACK_FAILED | \
   13637                 :            :          TG3_JMB_LOOPBACK_FAILED | \
   13638                 :            :          TG3_TSO_LOOPBACK_FAILED)
   13639                 :            : 
   13640                 :          0 : static int tg3_test_loopback(struct tg3 *tp, u64 *data, bool do_extlpbk)
   13641                 :            : {
   13642                 :          0 :         int err = -EIO;
   13643                 :          0 :         u32 eee_cap;
   13644                 :          0 :         u32 jmb_pkt_sz = 9000;
   13645                 :            : 
   13646         [ #  # ]:          0 :         if (tp->dma_limit)
   13647                 :          0 :                 jmb_pkt_sz = tp->dma_limit - ETH_HLEN;
   13648                 :            : 
   13649                 :          0 :         eee_cap = tp->phy_flags & TG3_PHYFLG_EEE_CAP;
   13650                 :          0 :         tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP;
   13651                 :            : 
   13652         [ #  # ]:          0 :         if (!netif_running(tp->dev)) {
   13653                 :          0 :                 data[TG3_MAC_LOOPB_TEST] = TG3_LOOPBACK_FAILED;
   13654                 :          0 :                 data[TG3_PHY_LOOPB_TEST] = TG3_LOOPBACK_FAILED;
   13655         [ #  # ]:          0 :                 if (do_extlpbk)
   13656                 :          0 :                         data[TG3_EXT_LOOPB_TEST] = TG3_LOOPBACK_FAILED;
   13657                 :          0 :                 goto done;
   13658                 :            :         }
   13659                 :            : 
   13660                 :          0 :         err = tg3_reset_hw(tp, true);
   13661         [ #  # ]:          0 :         if (err) {
   13662                 :          0 :                 data[TG3_MAC_LOOPB_TEST] = TG3_LOOPBACK_FAILED;
   13663                 :          0 :                 data[TG3_PHY_LOOPB_TEST] = TG3_LOOPBACK_FAILED;
   13664         [ #  # ]:          0 :                 if (do_extlpbk)
   13665                 :          0 :                         data[TG3_EXT_LOOPB_TEST] = TG3_LOOPBACK_FAILED;
   13666                 :          0 :                 goto done;
   13667                 :            :         }
   13668                 :            : 
   13669         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_RSS)) {
   13670                 :            :                 int i;
   13671                 :            : 
   13672                 :            :                 /* Reroute all rx packets to the 1st queue */
   13673                 :          0 :                 for (i = MAC_RSS_INDIR_TBL_0;
   13674         [ #  # ]:          0 :                      i < MAC_RSS_INDIR_TBL_0 + TG3_RSS_INDIR_TBL_SIZE; i += 4)
   13675                 :          0 :                         tw32(i, 0x0);
   13676                 :            :         }
   13677                 :            : 
   13678                 :            :         /* HW errata - mac loopback fails in some cases on 5780.
   13679                 :            :          * Normal traffic and PHY loopback are not affected by
   13680                 :            :          * errata.  Also, the MAC loopback test is deprecated for
   13681                 :            :          * all newer ASIC revisions.
   13682                 :            :          */
   13683   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5780 &&
   13684                 :            :             !tg3_flag(tp, CPMU_PRESENT)) {
   13685                 :          0 :                 tg3_mac_loopback(tp, true);
   13686                 :            : 
   13687         [ #  # ]:          0 :                 if (tg3_run_loopback(tp, ETH_FRAME_LEN, false))
   13688                 :          0 :                         data[TG3_MAC_LOOPB_TEST] |= TG3_STD_LOOPBACK_FAILED;
   13689                 :            : 
   13690   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, JUMBO_RING_ENABLE) &&
   13691                 :          0 :                     tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false))
   13692                 :          0 :                         data[TG3_MAC_LOOPB_TEST] |= TG3_JMB_LOOPBACK_FAILED;
   13693                 :            : 
   13694                 :          0 :                 tg3_mac_loopback(tp, false);
   13695                 :            :         }
   13696                 :            : 
   13697   [ #  #  #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES) &&
   13698                 :            :             !tg3_flag(tp, USE_PHYLIB)) {
   13699                 :          0 :                 int i;
   13700                 :            : 
   13701                 :          0 :                 tg3_phy_lpbk_set(tp, 0, false);
   13702                 :            : 
   13703                 :            :                 /* Wait for link */
   13704         [ #  # ]:          0 :                 for (i = 0; i < 100; i++) {
   13705         [ #  # ]:          0 :                         if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
   13706                 :            :                                 break;
   13707                 :          0 :                         mdelay(1);
   13708                 :            :                 }
   13709                 :            : 
   13710         [ #  # ]:          0 :                 if (tg3_run_loopback(tp, ETH_FRAME_LEN, false))
   13711                 :          0 :                         data[TG3_PHY_LOOPB_TEST] |= TG3_STD_LOOPBACK_FAILED;
   13712   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, TSO_CAPABLE) &&
   13713                 :          0 :                     tg3_run_loopback(tp, ETH_FRAME_LEN, true))
   13714                 :          0 :                         data[TG3_PHY_LOOPB_TEST] |= TG3_TSO_LOOPBACK_FAILED;
   13715   [ #  #  #  # ]:          0 :                 if (tg3_flag(tp, JUMBO_RING_ENABLE) &&
   13716                 :          0 :                     tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false))
   13717                 :          0 :                         data[TG3_PHY_LOOPB_TEST] |= TG3_JMB_LOOPBACK_FAILED;
   13718                 :            : 
   13719         [ #  # ]:          0 :                 if (do_extlpbk) {
   13720                 :          0 :                         tg3_phy_lpbk_set(tp, 0, true);
   13721                 :            : 
   13722                 :            :                         /* All link indications report up, but the hardware
   13723                 :            :                          * isn't really ready for about 20 msec.  Double it
   13724                 :            :                          * to be sure.
   13725                 :            :                          */
   13726         [ #  # ]:          0 :                         mdelay(40);
   13727                 :            : 
   13728         [ #  # ]:          0 :                         if (tg3_run_loopback(tp, ETH_FRAME_LEN, false))
   13729                 :          0 :                                 data[TG3_EXT_LOOPB_TEST] |=
   13730                 :            :                                                         TG3_STD_LOOPBACK_FAILED;
   13731   [ #  #  #  # ]:          0 :                         if (tg3_flag(tp, TSO_CAPABLE) &&
   13732                 :          0 :                             tg3_run_loopback(tp, ETH_FRAME_LEN, true))
   13733                 :          0 :                                 data[TG3_EXT_LOOPB_TEST] |=
   13734                 :            :                                                         TG3_TSO_LOOPBACK_FAILED;
   13735   [ #  #  #  # ]:          0 :                         if (tg3_flag(tp, JUMBO_RING_ENABLE) &&
   13736                 :          0 :                             tg3_run_loopback(tp, jmb_pkt_sz + ETH_HLEN, false))
   13737                 :          0 :                                 data[TG3_EXT_LOOPB_TEST] |=
   13738                 :            :                                                         TG3_JMB_LOOPBACK_FAILED;
   13739                 :            :                 }
   13740                 :            : 
   13741                 :            :                 /* Re-enable gphy autopowerdown. */
   13742         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_ENABLE_APD)
   13743                 :          0 :                         tg3_phy_toggle_apd(tp, true);
   13744                 :            :         }
   13745                 :            : 
   13746                 :          0 :         err = (data[TG3_MAC_LOOPB_TEST] | data[TG3_PHY_LOOPB_TEST] |
   13747         [ #  # ]:          0 :                data[TG3_EXT_LOOPB_TEST]) ? -EIO : 0;
   13748                 :            : 
   13749                 :          0 : done:
   13750                 :          0 :         tp->phy_flags |= eee_cap;
   13751                 :            : 
   13752                 :          0 :         return err;
   13753                 :            : }
   13754                 :            : 
   13755                 :          0 : static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
   13756                 :            :                           u64 *data)
   13757                 :            : {
   13758         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   13759                 :          0 :         bool doextlpbk = etest->flags & ETH_TEST_FL_EXTERNAL_LB;
   13760                 :            : 
   13761         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) {
   13762         [ #  # ]:          0 :                 if (tg3_power_up(tp)) {
   13763                 :          0 :                         etest->flags |= ETH_TEST_FL_FAILED;
   13764                 :          0 :                         memset(data, 1, sizeof(u64) * TG3_NUM_TEST);
   13765                 :          0 :                         return;
   13766                 :            :                 }
   13767                 :          0 :                 tg3_ape_driver_state_change(tp, RESET_KIND_INIT);
   13768                 :            :         }
   13769                 :            : 
   13770                 :          0 :         memset(data, 0, sizeof(u64) * TG3_NUM_TEST);
   13771                 :            : 
   13772         [ #  # ]:          0 :         if (tg3_test_nvram(tp) != 0) {
   13773                 :          0 :                 etest->flags |= ETH_TEST_FL_FAILED;
   13774                 :          0 :                 data[TG3_NVRAM_TEST] = 1;
   13775                 :            :         }
   13776   [ #  #  #  # ]:          0 :         if (!doextlpbk && tg3_test_link(tp)) {
   13777                 :          0 :                 etest->flags |= ETH_TEST_FL_FAILED;
   13778                 :          0 :                 data[TG3_LINK_TEST] = 1;
   13779                 :            :         }
   13780         [ #  # ]:          0 :         if (etest->flags & ETH_TEST_FL_OFFLINE) {
   13781                 :          0 :                 int err, err2 = 0, irq_sync = 0;
   13782                 :            : 
   13783         [ #  # ]:          0 :                 if (netif_running(dev)) {
   13784                 :          0 :                         tg3_phy_stop(tp);
   13785                 :          0 :                         tg3_netif_stop(tp);
   13786                 :          0 :                         irq_sync = 1;
   13787                 :            :                 }
   13788                 :            : 
   13789                 :          0 :                 tg3_full_lock(tp, irq_sync);
   13790                 :          0 :                 tg3_halt(tp, RESET_KIND_SUSPEND, 1);
   13791                 :          0 :                 err = tg3_nvram_lock(tp);
   13792                 :          0 :                 tg3_halt_cpu(tp, RX_CPU_BASE);
   13793         [ #  # ]:          0 :                 if (!tg3_flag(tp, 5705_PLUS))
   13794                 :          0 :                         tg3_halt_cpu(tp, TX_CPU_BASE);
   13795         [ #  # ]:          0 :                 if (!err)
   13796                 :          0 :                         tg3_nvram_unlock(tp);
   13797                 :            : 
   13798         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
   13799                 :          0 :                         tg3_phy_reset(tp);
   13800                 :            : 
   13801         [ #  # ]:          0 :                 if (tg3_test_registers(tp) != 0) {
   13802                 :          0 :                         etest->flags |= ETH_TEST_FL_FAILED;
   13803                 :          0 :                         data[TG3_REGISTER_TEST] = 1;
   13804                 :            :                 }
   13805                 :            : 
   13806         [ #  # ]:          0 :                 if (tg3_test_memory(tp) != 0) {
   13807                 :          0 :                         etest->flags |= ETH_TEST_FL_FAILED;
   13808                 :          0 :                         data[TG3_MEMORY_TEST] = 1;
   13809                 :            :                 }
   13810                 :            : 
   13811         [ #  # ]:          0 :                 if (doextlpbk)
   13812                 :          0 :                         etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
   13813                 :            : 
   13814         [ #  # ]:          0 :                 if (tg3_test_loopback(tp, data, doextlpbk))
   13815                 :          0 :                         etest->flags |= ETH_TEST_FL_FAILED;
   13816                 :            : 
   13817                 :          0 :                 tg3_full_unlock(tp);
   13818                 :            : 
   13819         [ #  # ]:          0 :                 if (tg3_test_interrupt(tp) != 0) {
   13820                 :          0 :                         etest->flags |= ETH_TEST_FL_FAILED;
   13821                 :          0 :                         data[TG3_INTERRUPT_TEST] = 1;
   13822                 :            :                 }
   13823                 :            : 
   13824                 :          0 :                 tg3_full_lock(tp, 0);
   13825                 :            : 
   13826                 :          0 :                 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   13827         [ #  # ]:          0 :                 if (netif_running(dev)) {
   13828                 :          0 :                         tg3_flag_set(tp, INIT_COMPLETE);
   13829                 :          0 :                         err2 = tg3_restart_hw(tp, true);
   13830         [ #  # ]:          0 :                         if (!err2)
   13831                 :          0 :                                 tg3_netif_start(tp);
   13832                 :            :                 }
   13833                 :            : 
   13834                 :          0 :                 tg3_full_unlock(tp);
   13835                 :            : 
   13836         [ #  # ]:          0 :                 if (irq_sync && !err2)
   13837                 :          0 :                         tg3_phy_start(tp);
   13838                 :            :         }
   13839         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)
   13840                 :          0 :                 tg3_power_down_prepare(tp);
   13841                 :            : 
   13842                 :            : }
   13843                 :            : 
   13844                 :            : static int tg3_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
   13845                 :            : {
   13846                 :            :         struct tg3 *tp = netdev_priv(dev);
   13847                 :            :         struct hwtstamp_config stmpconf;
   13848                 :            : 
   13849                 :            :         if (!tg3_flag(tp, PTP_CAPABLE))
   13850                 :            :                 return -EOPNOTSUPP;
   13851                 :            : 
   13852                 :            :         if (copy_from_user(&stmpconf, ifr->ifr_data, sizeof(stmpconf)))
   13853                 :            :                 return -EFAULT;
   13854                 :            : 
   13855                 :            :         if (stmpconf.flags)
   13856                 :            :                 return -EINVAL;
   13857                 :            : 
   13858                 :            :         if (stmpconf.tx_type != HWTSTAMP_TX_ON &&
   13859                 :            :             stmpconf.tx_type != HWTSTAMP_TX_OFF)
   13860                 :            :                 return -ERANGE;
   13861                 :            : 
   13862                 :            :         switch (stmpconf.rx_filter) {
   13863                 :            :         case HWTSTAMP_FILTER_NONE:
   13864                 :            :                 tp->rxptpctl = 0;
   13865                 :            :                 break;
   13866                 :            :         case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
   13867                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN |
   13868                 :            :                                TG3_RX_PTP_CTL_ALL_V1_EVENTS;
   13869                 :            :                 break;
   13870                 :            :         case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
   13871                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN |
   13872                 :            :                                TG3_RX_PTP_CTL_SYNC_EVNT;
   13873                 :            :                 break;
   13874                 :            :         case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
   13875                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V1_EN |
   13876                 :            :                                TG3_RX_PTP_CTL_DELAY_REQ;
   13877                 :            :                 break;
   13878                 :            :         case HWTSTAMP_FILTER_PTP_V2_EVENT:
   13879                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN |
   13880                 :            :                                TG3_RX_PTP_CTL_ALL_V2_EVENTS;
   13881                 :            :                 break;
   13882                 :            :         case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
   13883                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN |
   13884                 :            :                                TG3_RX_PTP_CTL_ALL_V2_EVENTS;
   13885                 :            :                 break;
   13886                 :            :         case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
   13887                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN |
   13888                 :            :                                TG3_RX_PTP_CTL_ALL_V2_EVENTS;
   13889                 :            :                 break;
   13890                 :            :         case HWTSTAMP_FILTER_PTP_V2_SYNC:
   13891                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN |
   13892                 :            :                                TG3_RX_PTP_CTL_SYNC_EVNT;
   13893                 :            :                 break;
   13894                 :            :         case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
   13895                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN |
   13896                 :            :                                TG3_RX_PTP_CTL_SYNC_EVNT;
   13897                 :            :                 break;
   13898                 :            :         case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
   13899                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN |
   13900                 :            :                                TG3_RX_PTP_CTL_SYNC_EVNT;
   13901                 :            :                 break;
   13902                 :            :         case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
   13903                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_EN |
   13904                 :            :                                TG3_RX_PTP_CTL_DELAY_REQ;
   13905                 :            :                 break;
   13906                 :            :         case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
   13907                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN |
   13908                 :            :                                TG3_RX_PTP_CTL_DELAY_REQ;
   13909                 :            :                 break;
   13910                 :            :         case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
   13911                 :            :                 tp->rxptpctl = TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN |
   13912                 :            :                                TG3_RX_PTP_CTL_DELAY_REQ;
   13913                 :            :                 break;
   13914                 :            :         default:
   13915                 :            :                 return -ERANGE;
   13916                 :            :         }
   13917                 :            : 
   13918                 :            :         if (netif_running(dev) && tp->rxptpctl)
   13919                 :            :                 tw32(TG3_RX_PTP_CTL,
   13920                 :            :                      tp->rxptpctl | TG3_RX_PTP_CTL_HWTS_INTERLOCK);
   13921                 :            : 
   13922                 :            :         if (stmpconf.tx_type == HWTSTAMP_TX_ON)
   13923                 :            :                 tg3_flag_set(tp, TX_TSTAMP_EN);
   13924                 :            :         else
   13925                 :            :                 tg3_flag_clear(tp, TX_TSTAMP_EN);
   13926                 :            : 
   13927                 :            :         return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ?
   13928                 :            :                 -EFAULT : 0;
   13929                 :            : }
   13930                 :            : 
   13931                 :            : static int tg3_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
   13932                 :            : {
   13933                 :            :         struct tg3 *tp = netdev_priv(dev);
   13934                 :            :         struct hwtstamp_config stmpconf;
   13935                 :            : 
   13936                 :            :         if (!tg3_flag(tp, PTP_CAPABLE))
   13937                 :            :                 return -EOPNOTSUPP;
   13938                 :            : 
   13939                 :            :         stmpconf.flags = 0;
   13940                 :            :         stmpconf.tx_type = (tg3_flag(tp, TX_TSTAMP_EN) ?
   13941                 :            :                             HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF);
   13942                 :            : 
   13943                 :            :         switch (tp->rxptpctl) {
   13944                 :            :         case 0:
   13945                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_NONE;
   13946                 :            :                 break;
   13947                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_ALL_V1_EVENTS:
   13948                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
   13949                 :            :                 break;
   13950                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
   13951                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_SYNC;
   13952                 :            :                 break;
   13953                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V1_EN | TG3_RX_PTP_CTL_DELAY_REQ:
   13954                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ;
   13955                 :            :                 break;
   13956                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS:
   13957                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
   13958                 :            :                 break;
   13959                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS:
   13960                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
   13961                 :            :                 break;
   13962                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_ALL_V2_EVENTS:
   13963                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
   13964                 :            :                 break;
   13965                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
   13966                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_SYNC;
   13967                 :            :                 break;
   13968                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
   13969                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_SYNC;
   13970                 :            :                 break;
   13971                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_SYNC_EVNT:
   13972                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_SYNC;
   13973                 :            :                 break;
   13974                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_EN | TG3_RX_PTP_CTL_DELAY_REQ:
   13975                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_DELAY_REQ;
   13976                 :            :                 break;
   13977                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_L2_EN | TG3_RX_PTP_CTL_DELAY_REQ:
   13978                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ;
   13979                 :            :                 break;
   13980                 :            :         case TG3_RX_PTP_CTL_RX_PTP_V2_L4_EN | TG3_RX_PTP_CTL_DELAY_REQ:
   13981                 :            :                 stmpconf.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ;
   13982                 :            :                 break;
   13983                 :            :         default:
   13984                 :            :                 WARN_ON_ONCE(1);
   13985                 :            :                 return -ERANGE;
   13986                 :            :         }
   13987                 :            : 
   13988                 :            :         return copy_to_user(ifr->ifr_data, &stmpconf, sizeof(stmpconf)) ?
   13989                 :            :                 -EFAULT : 0;
   13990                 :            : }
   13991                 :            : 
   13992                 :          0 : static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   13993                 :            : {
   13994                 :          0 :         struct mii_ioctl_data *data = if_mii(ifr);
   13995                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   13996                 :          0 :         int err;
   13997                 :            : 
   13998         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB)) {
   13999                 :          0 :                 struct phy_device *phydev;
   14000         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
   14001                 :            :                         return -EAGAIN;
   14002                 :          0 :                 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
   14003                 :          0 :                 return phy_mii_ioctl(phydev, ifr, cmd);
   14004                 :            :         }
   14005                 :            : 
   14006   [ #  #  #  #  :          0 :         switch (cmd) {
                   #  # ]
   14007                 :          0 :         case SIOCGMIIPHY:
   14008                 :          0 :                 data->phy_id = tp->phy_addr;
   14009                 :            : 
   14010                 :            :                 /* fall through */
   14011                 :          0 :         case SIOCGMIIREG: {
   14012                 :          0 :                 u32 mii_regval;
   14013                 :            : 
   14014         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
   14015                 :            :                         break;                  /* We have no PHY */
   14016                 :            : 
   14017         [ #  # ]:          0 :                 if (!netif_running(dev))
   14018                 :          0 :                         return -EAGAIN;
   14019                 :            : 
   14020                 :          0 :                 spin_lock_bh(&tp->lock);
   14021                 :          0 :                 err = __tg3_readphy(tp, data->phy_id & 0x1f,
   14022                 :          0 :                                     data->reg_num & 0x1f, &mii_regval);
   14023                 :          0 :                 spin_unlock_bh(&tp->lock);
   14024                 :            : 
   14025                 :          0 :                 data->val_out = mii_regval;
   14026                 :            : 
   14027                 :          0 :                 return err;
   14028                 :            :         }
   14029                 :            : 
   14030                 :          0 :         case SIOCSMIIREG:
   14031         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
   14032                 :            :                         break;                  /* We have no PHY */
   14033                 :            : 
   14034         [ #  # ]:          0 :                 if (!netif_running(dev))
   14035                 :            :                         return -EAGAIN;
   14036                 :            : 
   14037                 :          0 :                 spin_lock_bh(&tp->lock);
   14038                 :          0 :                 err = __tg3_writephy(tp, data->phy_id & 0x1f,
   14039                 :          0 :                                      data->reg_num & 0x1f, data->val_in);
   14040                 :          0 :                 spin_unlock_bh(&tp->lock);
   14041                 :            : 
   14042                 :          0 :                 return err;
   14043                 :            : 
   14044                 :          0 :         case SIOCSHWTSTAMP:
   14045                 :          0 :                 return tg3_hwtstamp_set(dev, ifr);
   14046                 :            : 
   14047                 :          0 :         case SIOCGHWTSTAMP:
   14048                 :          0 :                 return tg3_hwtstamp_get(dev, ifr);
   14049                 :            : 
   14050                 :            :         default:
   14051                 :            :                 /* do nothing */
   14052                 :            :                 break;
   14053                 :            :         }
   14054                 :          0 :         return -EOPNOTSUPP;
   14055                 :            : }
   14056                 :            : 
   14057                 :          0 : static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
   14058                 :            : {
   14059                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   14060                 :            : 
   14061                 :          0 :         memcpy(ec, &tp->coal, sizeof(*ec));
   14062                 :          0 :         return 0;
   14063                 :            : }
   14064                 :            : 
   14065                 :          0 : static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
   14066                 :            : {
   14067                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   14068                 :          0 :         u32 max_rxcoal_tick_int = 0, max_txcoal_tick_int = 0;
   14069                 :          0 :         u32 max_stat_coal_ticks = 0, min_stat_coal_ticks = 0;
   14070                 :            : 
   14071         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS)) {
   14072                 :          0 :                 max_rxcoal_tick_int = MAX_RXCOAL_TICK_INT;
   14073                 :          0 :                 max_txcoal_tick_int = MAX_TXCOAL_TICK_INT;
   14074                 :          0 :                 max_stat_coal_ticks = MAX_STAT_COAL_TICKS;
   14075                 :          0 :                 min_stat_coal_ticks = MIN_STAT_COAL_TICKS;
   14076                 :            :         }
   14077                 :            : 
   14078         [ #  # ]:          0 :         if ((ec->rx_coalesce_usecs > MAX_RXCOL_TICKS) ||
   14079                 :          0 :             (!ec->rx_coalesce_usecs) ||
   14080   [ #  #  #  # ]:          0 :             (ec->tx_coalesce_usecs > MAX_TXCOL_TICKS) ||
   14081                 :          0 :             (!ec->tx_coalesce_usecs) ||
   14082         [ #  # ]:          0 :             (ec->rx_max_coalesced_frames > MAX_RXMAX_FRAMES) ||
   14083         [ #  # ]:          0 :             (ec->tx_max_coalesced_frames > MAX_TXMAX_FRAMES) ||
   14084         [ #  # ]:          0 :             (ec->rx_coalesce_usecs_irq > max_rxcoal_tick_int) ||
   14085         [ #  # ]:          0 :             (ec->tx_coalesce_usecs_irq > max_txcoal_tick_int) ||
   14086         [ #  # ]:          0 :             (ec->rx_max_coalesced_frames_irq > MAX_RXCOAL_MAXF_INT) ||
   14087         [ #  # ]:          0 :             (ec->tx_max_coalesced_frames_irq > MAX_TXCOAL_MAXF_INT) ||
   14088   [ #  #  #  # ]:          0 :             (ec->stats_block_coalesce_usecs > max_stat_coal_ticks) ||
   14089                 :            :             (ec->stats_block_coalesce_usecs < min_stat_coal_ticks))
   14090                 :            :                 return -EINVAL;
   14091                 :            : 
   14092                 :            :         /* Only copy relevant parameters, ignore all others. */
   14093                 :          0 :         tp->coal.rx_coalesce_usecs = ec->rx_coalesce_usecs;
   14094                 :          0 :         tp->coal.tx_coalesce_usecs = ec->tx_coalesce_usecs;
   14095                 :          0 :         tp->coal.rx_max_coalesced_frames = ec->rx_max_coalesced_frames;
   14096                 :          0 :         tp->coal.tx_max_coalesced_frames = ec->tx_max_coalesced_frames;
   14097                 :          0 :         tp->coal.rx_coalesce_usecs_irq = ec->rx_coalesce_usecs_irq;
   14098                 :          0 :         tp->coal.tx_coalesce_usecs_irq = ec->tx_coalesce_usecs_irq;
   14099                 :          0 :         tp->coal.rx_max_coalesced_frames_irq = ec->rx_max_coalesced_frames_irq;
   14100                 :          0 :         tp->coal.tx_max_coalesced_frames_irq = ec->tx_max_coalesced_frames_irq;
   14101                 :          0 :         tp->coal.stats_block_coalesce_usecs = ec->stats_block_coalesce_usecs;
   14102                 :            : 
   14103         [ #  # ]:          0 :         if (netif_running(dev)) {
   14104                 :          0 :                 tg3_full_lock(tp, 0);
   14105                 :          0 :                 __tg3_set_coalesce(tp, &tp->coal);
   14106                 :          0 :                 tg3_full_unlock(tp);
   14107                 :            :         }
   14108                 :            :         return 0;
   14109                 :            : }
   14110                 :            : 
   14111                 :          0 : static int tg3_set_eee(struct net_device *dev, struct ethtool_eee *edata)
   14112                 :            : {
   14113         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   14114                 :            : 
   14115         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) {
   14116                 :          0 :                 netdev_warn(tp->dev, "Board does not support EEE!\n");
   14117                 :          0 :                 return -EOPNOTSUPP;
   14118                 :            :         }
   14119                 :            : 
   14120         [ #  # ]:          0 :         if (edata->advertised != tp->eee.advertised) {
   14121                 :          0 :                 netdev_warn(tp->dev,
   14122                 :            :                             "Direct manipulation of EEE advertisement is not supported\n");
   14123                 :          0 :                 return -EINVAL;
   14124                 :            :         }
   14125                 :            : 
   14126         [ #  # ]:          0 :         if (edata->tx_lpi_timer > TG3_CPMU_DBTMR1_LNKIDLE_MAX) {
   14127                 :          0 :                 netdev_warn(tp->dev,
   14128                 :            :                             "Maximal Tx Lpi timer supported is %#x(u)\n",
   14129                 :            :                             TG3_CPMU_DBTMR1_LNKIDLE_MAX);
   14130                 :          0 :                 return -EINVAL;
   14131                 :            :         }
   14132                 :            : 
   14133                 :          0 :         tp->eee = *edata;
   14134                 :            : 
   14135                 :          0 :         tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED;
   14136                 :          0 :         tg3_warn_mgmt_link_flap(tp);
   14137                 :            : 
   14138         [ #  # ]:          0 :         if (netif_running(tp->dev)) {
   14139                 :          0 :                 tg3_full_lock(tp, 0);
   14140                 :          0 :                 tg3_setup_eee(tp);
   14141                 :          0 :                 tg3_phy_reset(tp);
   14142                 :          0 :                 tg3_full_unlock(tp);
   14143                 :            :         }
   14144                 :            : 
   14145                 :            :         return 0;
   14146                 :            : }
   14147                 :            : 
   14148                 :          0 : static int tg3_get_eee(struct net_device *dev, struct ethtool_eee *edata)
   14149                 :            : {
   14150         [ #  # ]:          0 :         struct tg3 *tp = netdev_priv(dev);
   14151                 :            : 
   14152         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) {
   14153                 :          0 :                 netdev_warn(tp->dev,
   14154                 :            :                             "Board does not support EEE!\n");
   14155                 :          0 :                 return -EOPNOTSUPP;
   14156                 :            :         }
   14157                 :            : 
   14158                 :          0 :         *edata = tp->eee;
   14159                 :          0 :         return 0;
   14160                 :            : }
   14161                 :            : 
   14162                 :            : static const struct ethtool_ops tg3_ethtool_ops = {
   14163                 :            :         .get_drvinfo            = tg3_get_drvinfo,
   14164                 :            :         .get_regs_len           = tg3_get_regs_len,
   14165                 :            :         .get_regs               = tg3_get_regs,
   14166                 :            :         .get_wol                = tg3_get_wol,
   14167                 :            :         .set_wol                = tg3_set_wol,
   14168                 :            :         .get_msglevel           = tg3_get_msglevel,
   14169                 :            :         .set_msglevel           = tg3_set_msglevel,
   14170                 :            :         .nway_reset             = tg3_nway_reset,
   14171                 :            :         .get_link               = ethtool_op_get_link,
   14172                 :            :         .get_eeprom_len         = tg3_get_eeprom_len,
   14173                 :            :         .get_eeprom             = tg3_get_eeprom,
   14174                 :            :         .set_eeprom             = tg3_set_eeprom,
   14175                 :            :         .get_ringparam          = tg3_get_ringparam,
   14176                 :            :         .set_ringparam          = tg3_set_ringparam,
   14177                 :            :         .get_pauseparam         = tg3_get_pauseparam,
   14178                 :            :         .set_pauseparam         = tg3_set_pauseparam,
   14179                 :            :         .self_test              = tg3_self_test,
   14180                 :            :         .get_strings            = tg3_get_strings,
   14181                 :            :         .set_phys_id            = tg3_set_phys_id,
   14182                 :            :         .get_ethtool_stats      = tg3_get_ethtool_stats,
   14183                 :            :         .get_coalesce           = tg3_get_coalesce,
   14184                 :            :         .set_coalesce           = tg3_set_coalesce,
   14185                 :            :         .get_sset_count         = tg3_get_sset_count,
   14186                 :            :         .get_rxnfc              = tg3_get_rxnfc,
   14187                 :            :         .get_rxfh_indir_size    = tg3_get_rxfh_indir_size,
   14188                 :            :         .get_rxfh               = tg3_get_rxfh,
   14189                 :            :         .set_rxfh               = tg3_set_rxfh,
   14190                 :            :         .get_channels           = tg3_get_channels,
   14191                 :            :         .set_channels           = tg3_set_channels,
   14192                 :            :         .get_ts_info            = tg3_get_ts_info,
   14193                 :            :         .get_eee                = tg3_get_eee,
   14194                 :            :         .set_eee                = tg3_set_eee,
   14195                 :            :         .get_link_ksettings     = tg3_get_link_ksettings,
   14196                 :            :         .set_link_ksettings     = tg3_set_link_ksettings,
   14197                 :            : };
   14198                 :            : 
   14199                 :          0 : static void tg3_get_stats64(struct net_device *dev,
   14200                 :            :                             struct rtnl_link_stats64 *stats)
   14201                 :            : {
   14202                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   14203                 :            : 
   14204                 :          0 :         spin_lock_bh(&tp->lock);
   14205   [ #  #  #  # ]:          0 :         if (!tp->hw_stats || !tg3_flag(tp, INIT_COMPLETE)) {
   14206                 :          0 :                 *stats = tp->net_stats_prev;
   14207                 :          0 :                 spin_unlock_bh(&tp->lock);
   14208                 :          0 :                 return;
   14209                 :            :         }
   14210                 :            : 
   14211                 :          0 :         tg3_get_nstats(tp, stats);
   14212                 :          0 :         spin_unlock_bh(&tp->lock);
   14213                 :            : }
   14214                 :            : 
   14215                 :          0 : static void tg3_set_rx_mode(struct net_device *dev)
   14216                 :            : {
   14217                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   14218                 :            : 
   14219         [ #  # ]:          0 :         if (!netif_running(dev))
   14220                 :            :                 return;
   14221                 :            : 
   14222                 :          0 :         tg3_full_lock(tp, 0);
   14223                 :          0 :         __tg3_set_rx_mode(dev);
   14224                 :          0 :         tg3_full_unlock(tp);
   14225                 :            : }
   14226                 :            : 
   14227                 :          0 : static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
   14228                 :            :                                int new_mtu)
   14229                 :            : {
   14230                 :          0 :         dev->mtu = new_mtu;
   14231                 :            : 
   14232         [ #  # ]:          0 :         if (new_mtu > ETH_DATA_LEN) {
   14233         [ #  # ]:          0 :                 if (tg3_flag(tp, 5780_CLASS)) {
   14234                 :          0 :                         netdev_update_features(dev);
   14235                 :          0 :                         tg3_flag_clear(tp, TSO_CAPABLE);
   14236                 :            :                 } else {
   14237                 :          0 :                         tg3_flag_set(tp, JUMBO_RING_ENABLE);
   14238                 :            :                 }
   14239                 :            :         } else {
   14240         [ #  # ]:          0 :                 if (tg3_flag(tp, 5780_CLASS)) {
   14241                 :          0 :                         tg3_flag_set(tp, TSO_CAPABLE);
   14242                 :          0 :                         netdev_update_features(dev);
   14243                 :            :                 }
   14244                 :          0 :                 tg3_flag_clear(tp, JUMBO_RING_ENABLE);
   14245                 :            :         }
   14246                 :          0 : }
   14247                 :            : 
   14248                 :          0 : static int tg3_change_mtu(struct net_device *dev, int new_mtu)
   14249                 :            : {
   14250                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   14251                 :          0 :         int err;
   14252                 :          0 :         bool reset_phy = false;
   14253                 :            : 
   14254         [ #  # ]:          0 :         if (!netif_running(dev)) {
   14255                 :            :                 /* We'll just catch it later when the
   14256                 :            :                  * device is up'd.
   14257                 :            :                  */
   14258                 :          0 :                 tg3_set_mtu(dev, tp, new_mtu);
   14259                 :          0 :                 return 0;
   14260                 :            :         }
   14261                 :            : 
   14262                 :          0 :         tg3_phy_stop(tp);
   14263                 :            : 
   14264                 :          0 :         tg3_netif_stop(tp);
   14265                 :            : 
   14266                 :          0 :         tg3_set_mtu(dev, tp, new_mtu);
   14267                 :            : 
   14268                 :          0 :         tg3_full_lock(tp, 1);
   14269                 :            : 
   14270                 :          0 :         tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   14271                 :            : 
   14272                 :            :         /* Reset PHY, otherwise the read DMA engine will be in a mode that
   14273                 :            :          * breaks all requests to 256 bytes.
   14274                 :            :          */
   14275         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57766 ||
   14276         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5717 ||
   14277         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5719 ||
   14278                 :            :             tg3_asic_rev(tp) == ASIC_REV_5720)
   14279                 :          0 :                 reset_phy = true;
   14280                 :            : 
   14281                 :          0 :         err = tg3_restart_hw(tp, reset_phy);
   14282                 :            : 
   14283         [ #  # ]:          0 :         if (!err)
   14284                 :          0 :                 tg3_netif_start(tp);
   14285                 :            : 
   14286                 :          0 :         tg3_full_unlock(tp);
   14287                 :            : 
   14288         [ #  # ]:          0 :         if (!err)
   14289                 :          0 :                 tg3_phy_start(tp);
   14290                 :            : 
   14291                 :            :         return err;
   14292                 :            : }
   14293                 :            : 
   14294                 :            : static const struct net_device_ops tg3_netdev_ops = {
   14295                 :            :         .ndo_open               = tg3_open,
   14296                 :            :         .ndo_stop               = tg3_close,
   14297                 :            :         .ndo_start_xmit         = tg3_start_xmit,
   14298                 :            :         .ndo_get_stats64        = tg3_get_stats64,
   14299                 :            :         .ndo_validate_addr      = eth_validate_addr,
   14300                 :            :         .ndo_set_rx_mode        = tg3_set_rx_mode,
   14301                 :            :         .ndo_set_mac_address    = tg3_set_mac_addr,
   14302                 :            :         .ndo_do_ioctl           = tg3_ioctl,
   14303                 :            :         .ndo_tx_timeout         = tg3_tx_timeout,
   14304                 :            :         .ndo_change_mtu         = tg3_change_mtu,
   14305                 :            :         .ndo_fix_features       = tg3_fix_features,
   14306                 :            :         .ndo_set_features       = tg3_set_features,
   14307                 :            : #ifdef CONFIG_NET_POLL_CONTROLLER
   14308                 :            :         .ndo_poll_controller    = tg3_poll_controller,
   14309                 :            : #endif
   14310                 :            : };
   14311                 :            : 
   14312                 :          0 : static void tg3_get_eeprom_size(struct tg3 *tp)
   14313                 :            : {
   14314                 :          0 :         u32 cursize, val, magic;
   14315                 :            : 
   14316                 :          0 :         tp->nvram_size = EEPROM_CHIP_SIZE;
   14317                 :            : 
   14318         [ #  # ]:          0 :         if (tg3_nvram_read(tp, 0, &magic) != 0)
   14319                 :          0 :                 return;
   14320                 :            : 
   14321         [ #  # ]:          0 :         if ((magic != TG3_EEPROM_MAGIC) &&
   14322         [ #  # ]:          0 :             ((magic & TG3_EEPROM_MAGIC_FW_MSK) != TG3_EEPROM_MAGIC_FW) &&
   14323         [ #  # ]:          0 :             ((magic & TG3_EEPROM_MAGIC_HW_MSK) != TG3_EEPROM_MAGIC_HW))
   14324                 :            :                 return;
   14325                 :            : 
   14326                 :            :         /*
   14327                 :            :          * Size the chip by reading offsets at increasing powers of two.
   14328                 :            :          * When we encounter our validation signature, we know the addressing
   14329                 :            :          * has wrapped around, and thus have our chip size.
   14330                 :            :          */
   14331                 :            :         cursize = 0x10;
   14332                 :            : 
   14333         [ #  # ]:          0 :         while (cursize < tp->nvram_size) {
   14334         [ #  # ]:          0 :                 if (tg3_nvram_read(tp, cursize, &val) != 0)
   14335                 :            :                         return;
   14336                 :            : 
   14337         [ #  # ]:          0 :                 if (val == magic)
   14338                 :            :                         break;
   14339                 :            : 
   14340                 :          0 :                 cursize <<= 1;
   14341                 :            :         }
   14342                 :            : 
   14343                 :          0 :         tp->nvram_size = cursize;
   14344                 :            : }
   14345                 :            : 
   14346                 :          0 : static void tg3_get_nvram_size(struct tg3 *tp)
   14347                 :            : {
   14348                 :          0 :         u32 val;
   14349                 :            : 
   14350   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, NO_NVRAM) || tg3_nvram_read(tp, 0, &val) != 0)
   14351                 :          0 :                 return;
   14352                 :            : 
   14353                 :            :         /* Selfboot format */
   14354         [ #  # ]:          0 :         if (val != TG3_EEPROM_MAGIC) {
   14355                 :          0 :                 tg3_get_eeprom_size(tp);
   14356                 :          0 :                 return;
   14357                 :            :         }
   14358                 :            : 
   14359         [ #  # ]:          0 :         if (tg3_nvram_read(tp, 0xf0, &val) == 0) {
   14360         [ #  # ]:          0 :                 if (val != 0) {
   14361                 :            :                         /* This is confusing.  We want to operate on the
   14362                 :            :                          * 16-bit value at offset 0xf2.  The tg3_nvram_read()
   14363                 :            :                          * call will read from NVRAM and byteswap the data
   14364                 :            :                          * according to the byteswapping settings for all
   14365                 :            :                          * other register accesses.  This ensures the data we
   14366                 :            :                          * want will always reside in the lower 16-bits.
   14367                 :            :                          * However, the data in NVRAM is in LE format, which
   14368                 :            :                          * means the data from the NVRAM read will always be
   14369                 :            :                          * opposite the endianness of the CPU.  The 16-bit
   14370                 :            :                          * byteswap then brings the data to CPU endianness.
   14371                 :            :                          */
   14372                 :          0 :                         tp->nvram_size = swab16((u16)(val & 0x0000ffff)) * 1024;
   14373                 :          0 :                         return;
   14374                 :            :                 }
   14375                 :            :         }
   14376                 :          0 :         tp->nvram_size = TG3_NVRAM_SIZE_512KB;
   14377                 :            : }
   14378                 :            : 
   14379                 :          0 : static void tg3_get_nvram_info(struct tg3 *tp)
   14380                 :            : {
   14381                 :          0 :         u32 nvcfg1;
   14382                 :            : 
   14383                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14384         [ #  # ]:          0 :         if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
   14385                 :          0 :                 tg3_flag_set(tp, FLASH);
   14386                 :            :         } else {
   14387                 :          0 :                 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
   14388                 :          0 :                 tw32(NVRAM_CFG1, nvcfg1);
   14389                 :            :         }
   14390                 :            : 
   14391   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5750 ||
   14392                 :          0 :             tg3_flag(tp, 5780_CLASS)) {
   14393   [ #  #  #  #  :          0 :                 switch (nvcfg1 & NVRAM_CFG1_VENDOR_MASK) {
                #  #  # ]
   14394                 :          0 :                 case FLASH_VENDOR_ATMEL_FLASH_BUFFERED:
   14395                 :          0 :                         tp->nvram_jedecnum = JEDEC_ATMEL;
   14396                 :          0 :                         tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
   14397                 :          0 :                         tg3_flag_set(tp, NVRAM_BUFFERED);
   14398                 :            :                         break;
   14399                 :          0 :                 case FLASH_VENDOR_ATMEL_FLASH_UNBUFFERED:
   14400                 :          0 :                         tp->nvram_jedecnum = JEDEC_ATMEL;
   14401                 :          0 :                         tp->nvram_pagesize = ATMEL_AT25F512_PAGE_SIZE;
   14402                 :          0 :                         break;
   14403                 :          0 :                 case FLASH_VENDOR_ATMEL_EEPROM:
   14404                 :          0 :                         tp->nvram_jedecnum = JEDEC_ATMEL;
   14405                 :          0 :                         tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14406                 :          0 :                         tg3_flag_set(tp, NVRAM_BUFFERED);
   14407                 :            :                         break;
   14408                 :          0 :                 case FLASH_VENDOR_ST:
   14409                 :          0 :                         tp->nvram_jedecnum = JEDEC_ST;
   14410                 :          0 :                         tp->nvram_pagesize = ST_M45PEX0_PAGE_SIZE;
   14411                 :          0 :                         tg3_flag_set(tp, NVRAM_BUFFERED);
   14412                 :            :                         break;
   14413                 :          0 :                 case FLASH_VENDOR_SAIFUN:
   14414                 :          0 :                         tp->nvram_jedecnum = JEDEC_SAIFUN;
   14415                 :          0 :                         tp->nvram_pagesize = SAIFUN_SA25F0XX_PAGE_SIZE;
   14416                 :          0 :                         break;
   14417                 :          0 :                 case FLASH_VENDOR_SST_SMALL:
   14418                 :            :                 case FLASH_VENDOR_SST_LARGE:
   14419                 :          0 :                         tp->nvram_jedecnum = JEDEC_SST;
   14420                 :          0 :                         tp->nvram_pagesize = SST_25VF0X0_PAGE_SIZE;
   14421                 :          0 :                         break;
   14422                 :            :                 }
   14423                 :            :         } else {
   14424                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14425                 :          0 :                 tp->nvram_pagesize = ATMEL_AT45DB0X1B_PAGE_SIZE;
   14426                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14427                 :            :         }
   14428                 :          0 : }
   14429                 :            : 
   14430                 :            : static void tg3_nvram_get_pagesize(struct tg3 *tp, u32 nvmcfg1)
   14431                 :            : {
   14432                 :            :         switch (nvmcfg1 & NVRAM_CFG1_5752PAGE_SIZE_MASK) {
   14433                 :            :         case FLASH_5752PAGE_SIZE_256:
   14434                 :            :                 tp->nvram_pagesize = 256;
   14435                 :            :                 break;
   14436                 :            :         case FLASH_5752PAGE_SIZE_512:
   14437                 :            :                 tp->nvram_pagesize = 512;
   14438                 :            :                 break;
   14439                 :            :         case FLASH_5752PAGE_SIZE_1K:
   14440                 :            :                 tp->nvram_pagesize = 1024;
   14441                 :            :                 break;
   14442                 :            :         case FLASH_5752PAGE_SIZE_2K:
   14443                 :            :                 tp->nvram_pagesize = 2048;
   14444                 :            :                 break;
   14445                 :            :         case FLASH_5752PAGE_SIZE_4K:
   14446                 :            :                 tp->nvram_pagesize = 4096;
   14447                 :            :                 break;
   14448                 :            :         case FLASH_5752PAGE_SIZE_264:
   14449                 :            :                 tp->nvram_pagesize = 264;
   14450                 :            :                 break;
   14451                 :            :         case FLASH_5752PAGE_SIZE_528:
   14452                 :            :                 tp->nvram_pagesize = 528;
   14453                 :            :                 break;
   14454                 :            :         }
   14455                 :            : }
   14456                 :            : 
   14457                 :          0 : static void tg3_get_5752_nvram_info(struct tg3 *tp)
   14458                 :            : {
   14459                 :          0 :         u32 nvcfg1;
   14460                 :            : 
   14461                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14462                 :            : 
   14463                 :            :         /* NVRAM protection for TPM */
   14464         [ #  # ]:          0 :         if (nvcfg1 & (1 << 27))
   14465                 :          0 :                 tg3_flag_set(tp, PROTECTED_NVRAM);
   14466                 :            : 
   14467   [ #  #  #  # ]:          0 :         switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14468                 :          0 :         case FLASH_5752VENDOR_ATMEL_EEPROM_64KHZ:
   14469                 :            :         case FLASH_5752VENDOR_ATMEL_EEPROM_376KHZ:
   14470                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14471                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14472                 :            :                 break;
   14473                 :          0 :         case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
   14474                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14475                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14476                 :          0 :                 tg3_flag_set(tp, FLASH);
   14477                 :            :                 break;
   14478                 :          0 :         case FLASH_5752VENDOR_ST_M45PE10:
   14479                 :            :         case FLASH_5752VENDOR_ST_M45PE20:
   14480                 :            :         case FLASH_5752VENDOR_ST_M45PE40:
   14481                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14482                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14483                 :          0 :                 tg3_flag_set(tp, FLASH);
   14484                 :            :                 break;
   14485                 :            :         }
   14486                 :            : 
   14487         [ #  # ]:          0 :         if (tg3_flag(tp, FLASH)) {
   14488                 :          0 :                 tg3_nvram_get_pagesize(tp, nvcfg1);
   14489                 :            :         } else {
   14490                 :            :                 /* For eeprom, set pagesize to maximum eeprom size */
   14491                 :          0 :                 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14492                 :            : 
   14493                 :          0 :                 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
   14494                 :          0 :                 tw32(NVRAM_CFG1, nvcfg1);
   14495                 :            :         }
   14496                 :          0 : }
   14497                 :            : 
   14498                 :          0 : static void tg3_get_5755_nvram_info(struct tg3 *tp)
   14499                 :            : {
   14500                 :          0 :         u32 nvcfg1, protect = 0;
   14501                 :            : 
   14502                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14503                 :            : 
   14504                 :            :         /* NVRAM protection for TPM */
   14505         [ #  # ]:          0 :         if (nvcfg1 & (1 << 27)) {
   14506                 :          0 :                 tg3_flag_set(tp, PROTECTED_NVRAM);
   14507                 :          0 :                 protect = 1;
   14508                 :            :         }
   14509                 :            : 
   14510                 :          0 :         nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK;
   14511      [ #  #  # ]:          0 :         switch (nvcfg1) {
   14512                 :          0 :         case FLASH_5755VENDOR_ATMEL_FLASH_1:
   14513                 :            :         case FLASH_5755VENDOR_ATMEL_FLASH_2:
   14514                 :            :         case FLASH_5755VENDOR_ATMEL_FLASH_3:
   14515                 :            :         case FLASH_5755VENDOR_ATMEL_FLASH_5:
   14516                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14517                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14518                 :          0 :                 tg3_flag_set(tp, FLASH);
   14519                 :          0 :                 tp->nvram_pagesize = 264;
   14520                 :          0 :                 if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_1 ||
   14521         [ #  # ]:          0 :                     nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_5)
   14522         [ #  # ]:          0 :                         tp->nvram_size = (protect ? 0x3e200 :
   14523                 :            :                                           TG3_NVRAM_SIZE_512KB);
   14524         [ #  # ]:          0 :                 else if (nvcfg1 == FLASH_5755VENDOR_ATMEL_FLASH_2)
   14525         [ #  # ]:          0 :                         tp->nvram_size = (protect ? 0x1f200 :
   14526                 :            :                                           TG3_NVRAM_SIZE_256KB);
   14527                 :            :                 else
   14528         [ #  # ]:          0 :                         tp->nvram_size = (protect ? 0x1f200 :
   14529                 :            :                                           TG3_NVRAM_SIZE_128KB);
   14530                 :            :                 break;
   14531                 :          0 :         case FLASH_5752VENDOR_ST_M45PE10:
   14532                 :            :         case FLASH_5752VENDOR_ST_M45PE20:
   14533                 :            :         case FLASH_5752VENDOR_ST_M45PE40:
   14534                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14535                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14536                 :          0 :                 tg3_flag_set(tp, FLASH);
   14537                 :          0 :                 tp->nvram_pagesize = 256;
   14538         [ #  # ]:          0 :                 if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE10)
   14539                 :          0 :                         tp->nvram_size = (protect ?
   14540         [ #  # ]:          0 :                                           TG3_NVRAM_SIZE_64KB :
   14541                 :            :                                           TG3_NVRAM_SIZE_128KB);
   14542         [ #  # ]:          0 :                 else if (nvcfg1 == FLASH_5752VENDOR_ST_M45PE20)
   14543                 :          0 :                         tp->nvram_size = (protect ?
   14544         [ #  # ]:          0 :                                           TG3_NVRAM_SIZE_64KB :
   14545                 :            :                                           TG3_NVRAM_SIZE_256KB);
   14546                 :            :                 else
   14547                 :          0 :                         tp->nvram_size = (protect ?
   14548         [ #  # ]:          0 :                                           TG3_NVRAM_SIZE_128KB :
   14549                 :            :                                           TG3_NVRAM_SIZE_512KB);
   14550                 :            :                 break;
   14551                 :            :         }
   14552                 :          0 : }
   14553                 :            : 
   14554                 :          0 : static void tg3_get_5787_nvram_info(struct tg3 *tp)
   14555                 :            : {
   14556                 :          0 :         u32 nvcfg1;
   14557                 :            : 
   14558                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14559                 :            : 
   14560   [ #  #  #  # ]:          0 :         switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14561                 :          0 :         case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ:
   14562                 :            :         case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ:
   14563                 :            :         case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ:
   14564                 :            :         case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ:
   14565                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14566                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14567                 :          0 :                 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14568                 :            : 
   14569                 :          0 :                 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
   14570                 :          0 :                 tw32(NVRAM_CFG1, nvcfg1);
   14571                 :          0 :                 break;
   14572                 :          0 :         case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
   14573                 :            :         case FLASH_5755VENDOR_ATMEL_FLASH_1:
   14574                 :            :         case FLASH_5755VENDOR_ATMEL_FLASH_2:
   14575                 :            :         case FLASH_5755VENDOR_ATMEL_FLASH_3:
   14576                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14577                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14578                 :          0 :                 tg3_flag_set(tp, FLASH);
   14579                 :          0 :                 tp->nvram_pagesize = 264;
   14580                 :          0 :                 break;
   14581                 :          0 :         case FLASH_5752VENDOR_ST_M45PE10:
   14582                 :            :         case FLASH_5752VENDOR_ST_M45PE20:
   14583                 :            :         case FLASH_5752VENDOR_ST_M45PE40:
   14584                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14585                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14586                 :          0 :                 tg3_flag_set(tp, FLASH);
   14587                 :          0 :                 tp->nvram_pagesize = 256;
   14588                 :          0 :                 break;
   14589                 :            :         }
   14590                 :          0 : }
   14591                 :            : 
   14592                 :          0 : static void tg3_get_5761_nvram_info(struct tg3 *tp)
   14593                 :            : {
   14594                 :          0 :         u32 nvcfg1, protect = 0;
   14595                 :            : 
   14596                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14597                 :            : 
   14598                 :            :         /* NVRAM protection for TPM */
   14599         [ #  # ]:          0 :         if (nvcfg1 & (1 << 27)) {
   14600                 :          0 :                 tg3_flag_set(tp, PROTECTED_NVRAM);
   14601                 :          0 :                 protect = 1;
   14602                 :            :         }
   14603                 :            : 
   14604                 :          0 :         nvcfg1 &= NVRAM_CFG1_5752VENDOR_MASK;
   14605      [ #  #  # ]:          0 :         switch (nvcfg1) {
   14606                 :          0 :         case FLASH_5761VENDOR_ATMEL_ADB021D:
   14607                 :            :         case FLASH_5761VENDOR_ATMEL_ADB041D:
   14608                 :            :         case FLASH_5761VENDOR_ATMEL_ADB081D:
   14609                 :            :         case FLASH_5761VENDOR_ATMEL_ADB161D:
   14610                 :            :         case FLASH_5761VENDOR_ATMEL_MDB021D:
   14611                 :            :         case FLASH_5761VENDOR_ATMEL_MDB041D:
   14612                 :            :         case FLASH_5761VENDOR_ATMEL_MDB081D:
   14613                 :            :         case FLASH_5761VENDOR_ATMEL_MDB161D:
   14614                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14615                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14616                 :          0 :                 tg3_flag_set(tp, FLASH);
   14617                 :          0 :                 tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS);
   14618                 :          0 :                 tp->nvram_pagesize = 256;
   14619                 :          0 :                 break;
   14620                 :          0 :         case FLASH_5761VENDOR_ST_A_M45PE20:
   14621                 :            :         case FLASH_5761VENDOR_ST_A_M45PE40:
   14622                 :            :         case FLASH_5761VENDOR_ST_A_M45PE80:
   14623                 :            :         case FLASH_5761VENDOR_ST_A_M45PE16:
   14624                 :            :         case FLASH_5761VENDOR_ST_M_M45PE20:
   14625                 :            :         case FLASH_5761VENDOR_ST_M_M45PE40:
   14626                 :            :         case FLASH_5761VENDOR_ST_M_M45PE80:
   14627                 :            :         case FLASH_5761VENDOR_ST_M_M45PE16:
   14628                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14629                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14630                 :          0 :                 tg3_flag_set(tp, FLASH);
   14631                 :          0 :                 tp->nvram_pagesize = 256;
   14632                 :          0 :                 break;
   14633                 :            :         }
   14634                 :            : 
   14635         [ #  # ]:          0 :         if (protect) {
   14636                 :          0 :                 tp->nvram_size = tr32(NVRAM_ADDR_LOCKOUT);
   14637                 :            :         } else {
   14638   [ #  #  #  #  :          0 :                 switch (nvcfg1) {
                      # ]
   14639                 :          0 :                 case FLASH_5761VENDOR_ATMEL_ADB161D:
   14640                 :            :                 case FLASH_5761VENDOR_ATMEL_MDB161D:
   14641                 :            :                 case FLASH_5761VENDOR_ST_A_M45PE16:
   14642                 :            :                 case FLASH_5761VENDOR_ST_M_M45PE16:
   14643                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_2MB;
   14644                 :          0 :                         break;
   14645                 :          0 :                 case FLASH_5761VENDOR_ATMEL_ADB081D:
   14646                 :            :                 case FLASH_5761VENDOR_ATMEL_MDB081D:
   14647                 :            :                 case FLASH_5761VENDOR_ST_A_M45PE80:
   14648                 :            :                 case FLASH_5761VENDOR_ST_M_M45PE80:
   14649                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_1MB;
   14650                 :          0 :                         break;
   14651                 :          0 :                 case FLASH_5761VENDOR_ATMEL_ADB041D:
   14652                 :            :                 case FLASH_5761VENDOR_ATMEL_MDB041D:
   14653                 :            :                 case FLASH_5761VENDOR_ST_A_M45PE40:
   14654                 :            :                 case FLASH_5761VENDOR_ST_M_M45PE40:
   14655                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_512KB;
   14656                 :          0 :                         break;
   14657                 :          0 :                 case FLASH_5761VENDOR_ATMEL_ADB021D:
   14658                 :            :                 case FLASH_5761VENDOR_ATMEL_MDB021D:
   14659                 :            :                 case FLASH_5761VENDOR_ST_A_M45PE20:
   14660                 :            :                 case FLASH_5761VENDOR_ST_M_M45PE20:
   14661                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14662                 :          0 :                         break;
   14663                 :            :                 }
   14664                 :          0 :         }
   14665                 :          0 : }
   14666                 :            : 
   14667                 :          0 : static void tg3_get_5906_nvram_info(struct tg3 *tp)
   14668                 :            : {
   14669                 :          0 :         tp->nvram_jedecnum = JEDEC_ATMEL;
   14670                 :          0 :         tg3_flag_set(tp, NVRAM_BUFFERED);
   14671                 :          0 :         tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14672                 :          0 : }
   14673                 :            : 
   14674                 :          0 : static void tg3_get_57780_nvram_info(struct tg3 *tp)
   14675                 :            : {
   14676                 :          0 :         u32 nvcfg1;
   14677                 :            : 
   14678                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14679                 :            : 
   14680   [ #  #  #  # ]:          0 :         switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14681                 :          0 :         case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ:
   14682                 :            :         case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ:
   14683                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14684                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14685                 :          0 :                 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14686                 :            : 
   14687                 :          0 :                 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
   14688                 :          0 :                 tw32(NVRAM_CFG1, nvcfg1);
   14689                 :          0 :                 return;
   14690                 :          0 :         case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
   14691                 :            :         case FLASH_57780VENDOR_ATMEL_AT45DB011D:
   14692                 :            :         case FLASH_57780VENDOR_ATMEL_AT45DB011B:
   14693                 :            :         case FLASH_57780VENDOR_ATMEL_AT45DB021D:
   14694                 :            :         case FLASH_57780VENDOR_ATMEL_AT45DB021B:
   14695                 :            :         case FLASH_57780VENDOR_ATMEL_AT45DB041D:
   14696                 :            :         case FLASH_57780VENDOR_ATMEL_AT45DB041B:
   14697                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14698                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14699                 :          0 :                 tg3_flag_set(tp, FLASH);
   14700                 :            : 
   14701   [ #  #  #  # ]:          0 :                 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14702                 :          0 :                 case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
   14703                 :            :                 case FLASH_57780VENDOR_ATMEL_AT45DB011D:
   14704                 :            :                 case FLASH_57780VENDOR_ATMEL_AT45DB011B:
   14705                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_128KB;
   14706                 :          0 :                         break;
   14707                 :          0 :                 case FLASH_57780VENDOR_ATMEL_AT45DB021D:
   14708                 :            :                 case FLASH_57780VENDOR_ATMEL_AT45DB021B:
   14709                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14710                 :          0 :                         break;
   14711                 :          0 :                 case FLASH_57780VENDOR_ATMEL_AT45DB041D:
   14712                 :            :                 case FLASH_57780VENDOR_ATMEL_AT45DB041B:
   14713                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_512KB;
   14714                 :          0 :                         break;
   14715                 :            :                 }
   14716                 :            :                 break;
   14717                 :          0 :         case FLASH_5752VENDOR_ST_M45PE10:
   14718                 :            :         case FLASH_5752VENDOR_ST_M45PE20:
   14719                 :            :         case FLASH_5752VENDOR_ST_M45PE40:
   14720                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14721                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14722                 :          0 :                 tg3_flag_set(tp, FLASH);
   14723                 :            : 
   14724   [ #  #  #  # ]:          0 :                 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14725                 :          0 :                 case FLASH_5752VENDOR_ST_M45PE10:
   14726                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_128KB;
   14727                 :          0 :                         break;
   14728                 :          0 :                 case FLASH_5752VENDOR_ST_M45PE20:
   14729                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14730                 :          0 :                         break;
   14731                 :          0 :                 case FLASH_5752VENDOR_ST_M45PE40:
   14732                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_512KB;
   14733                 :          0 :                         break;
   14734                 :            :                 }
   14735                 :            :                 break;
   14736                 :          0 :         default:
   14737                 :          0 :                 tg3_flag_set(tp, NO_NVRAM);
   14738                 :            :                 return;
   14739                 :            :         }
   14740                 :            : 
   14741                 :          0 :         tg3_nvram_get_pagesize(tp, nvcfg1);
   14742         [ #  # ]:          0 :         if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528)
   14743                 :          0 :                 tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS);
   14744                 :            : }
   14745                 :            : 
   14746                 :            : 
   14747                 :          0 : static void tg3_get_5717_nvram_info(struct tg3 *tp)
   14748                 :            : {
   14749                 :          0 :         u32 nvcfg1;
   14750                 :            : 
   14751                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14752                 :            : 
   14753   [ #  #  #  # ]:          0 :         switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14754                 :          0 :         case FLASH_5717VENDOR_ATMEL_EEPROM:
   14755                 :            :         case FLASH_5717VENDOR_MICRO_EEPROM:
   14756                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14757                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14758                 :          0 :                 tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14759                 :            : 
   14760                 :          0 :                 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
   14761                 :          0 :                 tw32(NVRAM_CFG1, nvcfg1);
   14762                 :          0 :                 return;
   14763                 :          0 :         case FLASH_5717VENDOR_ATMEL_MDB011D:
   14764                 :            :         case FLASH_5717VENDOR_ATMEL_ADB011B:
   14765                 :            :         case FLASH_5717VENDOR_ATMEL_ADB011D:
   14766                 :            :         case FLASH_5717VENDOR_ATMEL_MDB021D:
   14767                 :            :         case FLASH_5717VENDOR_ATMEL_ADB021B:
   14768                 :            :         case FLASH_5717VENDOR_ATMEL_ADB021D:
   14769                 :            :         case FLASH_5717VENDOR_ATMEL_45USPT:
   14770                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14771                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14772                 :          0 :                 tg3_flag_set(tp, FLASH);
   14773                 :            : 
   14774      [ #  #  # ]:          0 :                 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14775                 :            :                 case FLASH_5717VENDOR_ATMEL_MDB021D:
   14776                 :            :                         /* Detect size with tg3_nvram_get_size() */
   14777                 :            :                         break;
   14778                 :          0 :                 case FLASH_5717VENDOR_ATMEL_ADB021B:
   14779                 :            :                 case FLASH_5717VENDOR_ATMEL_ADB021D:
   14780                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14781                 :          0 :                         break;
   14782                 :          0 :                 default:
   14783                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_128KB;
   14784                 :          0 :                         break;
   14785                 :            :                 }
   14786                 :            :                 break;
   14787                 :          0 :         case FLASH_5717VENDOR_ST_M_M25PE10:
   14788                 :            :         case FLASH_5717VENDOR_ST_A_M25PE10:
   14789                 :            :         case FLASH_5717VENDOR_ST_M_M45PE10:
   14790                 :            :         case FLASH_5717VENDOR_ST_A_M45PE10:
   14791                 :            :         case FLASH_5717VENDOR_ST_M_M25PE20:
   14792                 :            :         case FLASH_5717VENDOR_ST_A_M25PE20:
   14793                 :            :         case FLASH_5717VENDOR_ST_M_M45PE20:
   14794                 :            :         case FLASH_5717VENDOR_ST_A_M45PE20:
   14795                 :            :         case FLASH_5717VENDOR_ST_25USPT:
   14796                 :            :         case FLASH_5717VENDOR_ST_45USPT:
   14797                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14798                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14799                 :          0 :                 tg3_flag_set(tp, FLASH);
   14800                 :            : 
   14801      [ #  #  # ]:          0 :                 switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
   14802                 :            :                 case FLASH_5717VENDOR_ST_M_M25PE20:
   14803                 :            :                 case FLASH_5717VENDOR_ST_M_M45PE20:
   14804                 :            :                         /* Detect size with tg3_nvram_get_size() */
   14805                 :            :                         break;
   14806                 :          0 :                 case FLASH_5717VENDOR_ST_A_M25PE20:
   14807                 :            :                 case FLASH_5717VENDOR_ST_A_M45PE20:
   14808                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14809                 :          0 :                         break;
   14810                 :          0 :                 default:
   14811                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_128KB;
   14812                 :          0 :                         break;
   14813                 :            :                 }
   14814                 :            :                 break;
   14815                 :          0 :         default:
   14816                 :          0 :                 tg3_flag_set(tp, NO_NVRAM);
   14817                 :            :                 return;
   14818                 :            :         }
   14819                 :            : 
   14820                 :          0 :         tg3_nvram_get_pagesize(tp, nvcfg1);
   14821         [ #  # ]:          0 :         if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528)
   14822                 :          0 :                 tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS);
   14823                 :            : }
   14824                 :            : 
   14825                 :          0 : static void tg3_get_5720_nvram_info(struct tg3 *tp)
   14826                 :            : {
   14827                 :          0 :         u32 nvcfg1, nvmpinstrp, nv_status;
   14828                 :            : 
   14829                 :          0 :         nvcfg1 = tr32(NVRAM_CFG1);
   14830                 :          0 :         nvmpinstrp = nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK;
   14831                 :            : 
   14832         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5762) {
   14833         [ #  # ]:          0 :                 if (!(nvcfg1 & NVRAM_CFG1_5762VENDOR_MASK)) {
   14834                 :          0 :                         tg3_flag_set(tp, NO_NVRAM);
   14835                 :          0 :                         return;
   14836                 :            :                 }
   14837                 :            : 
   14838   [ #  #  #  #  :          0 :                 switch (nvmpinstrp) {
                      # ]
   14839                 :          0 :                 case FLASH_5762_MX25L_100:
   14840                 :            :                 case FLASH_5762_MX25L_200:
   14841                 :            :                 case FLASH_5762_MX25L_400:
   14842                 :            :                 case FLASH_5762_MX25L_800:
   14843                 :            :                 case FLASH_5762_MX25L_160_320:
   14844                 :          0 :                         tp->nvram_pagesize = 4096;
   14845                 :          0 :                         tp->nvram_jedecnum = JEDEC_MACRONIX;
   14846                 :          0 :                         tg3_flag_set(tp, NVRAM_BUFFERED);
   14847                 :          0 :                         tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS);
   14848                 :          0 :                         tg3_flag_set(tp, FLASH);
   14849                 :          0 :                         nv_status = tr32(NVRAM_AUTOSENSE_STATUS);
   14850                 :          0 :                         tp->nvram_size =
   14851                 :          0 :                                 (1 << (nv_status >> AUTOSENSE_DEVID &
   14852                 :            :                                                 AUTOSENSE_DEVID_MASK)
   14853                 :          0 :                                         << AUTOSENSE_SIZE_IN_MB);
   14854                 :          0 :                         return;
   14855                 :            : 
   14856                 :            :                 case FLASH_5762_EEPROM_HD:
   14857                 :            :                         nvmpinstrp = FLASH_5720_EEPROM_HD;
   14858                 :            :                         break;
   14859                 :            :                 case FLASH_5762_EEPROM_LD:
   14860                 :          0 :                         nvmpinstrp = FLASH_5720_EEPROM_LD;
   14861                 :          0 :                         break;
   14862                 :            :                 case FLASH_5720VENDOR_M_ST_M45PE20:
   14863                 :            :                         /* This pinstrap supports multiple sizes, so force it
   14864                 :            :                          * to read the actual size from location 0xf0.
   14865                 :            :                          */
   14866                 :            :                         nvmpinstrp = FLASH_5720VENDOR_ST_45USPT;
   14867                 :            :                         break;
   14868                 :            :                 }
   14869                 :          0 :         }
   14870                 :            : 
   14871   [ #  #  #  # ]:          0 :         switch (nvmpinstrp) {
   14872                 :          0 :         case FLASH_5720_EEPROM_HD:
   14873                 :            :         case FLASH_5720_EEPROM_LD:
   14874                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14875                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14876                 :            : 
   14877                 :          0 :                 nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
   14878                 :          0 :                 tw32(NVRAM_CFG1, nvcfg1);
   14879         [ #  # ]:          0 :                 if (nvmpinstrp == FLASH_5720_EEPROM_HD)
   14880                 :          0 :                         tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
   14881                 :            :                 else
   14882                 :          0 :                         tp->nvram_pagesize = ATMEL_AT24C02_CHIP_SIZE;
   14883                 :            :                 return;
   14884                 :          0 :         case FLASH_5720VENDOR_M_ATMEL_DB011D:
   14885                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB011B:
   14886                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB011D:
   14887                 :            :         case FLASH_5720VENDOR_M_ATMEL_DB021D:
   14888                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB021B:
   14889                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB021D:
   14890                 :            :         case FLASH_5720VENDOR_M_ATMEL_DB041D:
   14891                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB041B:
   14892                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB041D:
   14893                 :            :         case FLASH_5720VENDOR_M_ATMEL_DB081D:
   14894                 :            :         case FLASH_5720VENDOR_A_ATMEL_DB081D:
   14895                 :            :         case FLASH_5720VENDOR_ATMEL_45USPT:
   14896                 :          0 :                 tp->nvram_jedecnum = JEDEC_ATMEL;
   14897                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14898                 :          0 :                 tg3_flag_set(tp, FLASH);
   14899                 :            : 
   14900   [ #  #  #  # ]:          0 :                 switch (nvmpinstrp) {
   14901                 :          0 :                 case FLASH_5720VENDOR_M_ATMEL_DB021D:
   14902                 :            :                 case FLASH_5720VENDOR_A_ATMEL_DB021B:
   14903                 :            :                 case FLASH_5720VENDOR_A_ATMEL_DB021D:
   14904                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14905                 :          0 :                         break;
   14906                 :          0 :                 case FLASH_5720VENDOR_M_ATMEL_DB041D:
   14907                 :            :                 case FLASH_5720VENDOR_A_ATMEL_DB041B:
   14908                 :            :                 case FLASH_5720VENDOR_A_ATMEL_DB041D:
   14909                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_512KB;
   14910                 :          0 :                         break;
   14911                 :          0 :                 case FLASH_5720VENDOR_M_ATMEL_DB081D:
   14912                 :            :                 case FLASH_5720VENDOR_A_ATMEL_DB081D:
   14913                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_1MB;
   14914                 :          0 :                         break;
   14915                 :          0 :                 default:
   14916         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) != ASIC_REV_5762)
   14917                 :          0 :                                 tp->nvram_size = TG3_NVRAM_SIZE_128KB;
   14918                 :            :                         break;
   14919                 :            :                 }
   14920                 :            :                 break;
   14921                 :          0 :         case FLASH_5720VENDOR_M_ST_M25PE10:
   14922                 :            :         case FLASH_5720VENDOR_M_ST_M45PE10:
   14923                 :            :         case FLASH_5720VENDOR_A_ST_M25PE10:
   14924                 :            :         case FLASH_5720VENDOR_A_ST_M45PE10:
   14925                 :            :         case FLASH_5720VENDOR_M_ST_M25PE20:
   14926                 :            :         case FLASH_5720VENDOR_M_ST_M45PE20:
   14927                 :            :         case FLASH_5720VENDOR_A_ST_M25PE20:
   14928                 :            :         case FLASH_5720VENDOR_A_ST_M45PE20:
   14929                 :            :         case FLASH_5720VENDOR_M_ST_M25PE40:
   14930                 :            :         case FLASH_5720VENDOR_M_ST_M45PE40:
   14931                 :            :         case FLASH_5720VENDOR_A_ST_M25PE40:
   14932                 :            :         case FLASH_5720VENDOR_A_ST_M45PE40:
   14933                 :            :         case FLASH_5720VENDOR_M_ST_M25PE80:
   14934                 :            :         case FLASH_5720VENDOR_M_ST_M45PE80:
   14935                 :            :         case FLASH_5720VENDOR_A_ST_M25PE80:
   14936                 :            :         case FLASH_5720VENDOR_A_ST_M45PE80:
   14937                 :            :         case FLASH_5720VENDOR_ST_25USPT:
   14938                 :            :         case FLASH_5720VENDOR_ST_45USPT:
   14939                 :          0 :                 tp->nvram_jedecnum = JEDEC_ST;
   14940                 :          0 :                 tg3_flag_set(tp, NVRAM_BUFFERED);
   14941                 :          0 :                 tg3_flag_set(tp, FLASH);
   14942                 :            : 
   14943   [ #  #  #  # ]:          0 :                 switch (nvmpinstrp) {
   14944                 :          0 :                 case FLASH_5720VENDOR_M_ST_M25PE20:
   14945                 :            :                 case FLASH_5720VENDOR_M_ST_M45PE20:
   14946                 :            :                 case FLASH_5720VENDOR_A_ST_M25PE20:
   14947                 :            :                 case FLASH_5720VENDOR_A_ST_M45PE20:
   14948                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_256KB;
   14949                 :          0 :                         break;
   14950                 :          0 :                 case FLASH_5720VENDOR_M_ST_M25PE40:
   14951                 :            :                 case FLASH_5720VENDOR_M_ST_M45PE40:
   14952                 :            :                 case FLASH_5720VENDOR_A_ST_M25PE40:
   14953                 :            :                 case FLASH_5720VENDOR_A_ST_M45PE40:
   14954                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_512KB;
   14955                 :          0 :                         break;
   14956                 :          0 :                 case FLASH_5720VENDOR_M_ST_M25PE80:
   14957                 :            :                 case FLASH_5720VENDOR_M_ST_M45PE80:
   14958                 :            :                 case FLASH_5720VENDOR_A_ST_M25PE80:
   14959                 :            :                 case FLASH_5720VENDOR_A_ST_M45PE80:
   14960                 :          0 :                         tp->nvram_size = TG3_NVRAM_SIZE_1MB;
   14961                 :          0 :                         break;
   14962                 :          0 :                 default:
   14963         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) != ASIC_REV_5762)
   14964                 :          0 :                                 tp->nvram_size = TG3_NVRAM_SIZE_128KB;
   14965                 :            :                         break;
   14966                 :            :                 }
   14967                 :            :                 break;
   14968                 :          0 :         default:
   14969                 :          0 :                 tg3_flag_set(tp, NO_NVRAM);
   14970                 :            :                 return;
   14971                 :            :         }
   14972                 :            : 
   14973                 :          0 :         tg3_nvram_get_pagesize(tp, nvcfg1);
   14974         [ #  # ]:          0 :         if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528)
   14975                 :          0 :                 tg3_flag_set(tp, NO_NVRAM_ADDR_TRANS);
   14976                 :            : 
   14977         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5762) {
   14978                 :          0 :                 u32 val;
   14979                 :            : 
   14980         [ #  # ]:          0 :                 if (tg3_nvram_read(tp, 0, &val))
   14981                 :          0 :                         return;
   14982                 :            : 
   14983         [ #  # ]:          0 :                 if (val != TG3_EEPROM_MAGIC &&
   14984         [ #  # ]:          0 :                     (val & TG3_EEPROM_MAGIC_FW_MSK) != TG3_EEPROM_MAGIC_FW)
   14985                 :          0 :                         tg3_flag_set(tp, NO_NVRAM);
   14986                 :            :         }
   14987                 :            : }
   14988                 :            : 
   14989                 :            : /* Chips other than 5700/5701 use the NVRAM for fetching info. */
   14990                 :          0 : static void tg3_nvram_init(struct tg3 *tp)
   14991                 :            : {
   14992         [ #  # ]:          0 :         if (tg3_flag(tp, IS_SSB_CORE)) {
   14993                 :            :                 /* No NVRAM and EEPROM on the SSB Broadcom GigE core. */
   14994                 :          0 :                 tg3_flag_clear(tp, NVRAM);
   14995                 :          0 :                 tg3_flag_clear(tp, NVRAM_BUFFERED);
   14996                 :          0 :                 tg3_flag_set(tp, NO_NVRAM);
   14997                 :          0 :                 return;
   14998                 :            :         }
   14999                 :            : 
   15000                 :          0 :         tw32_f(GRC_EEPROM_ADDR,
   15001                 :            :              (EEPROM_ADDR_FSM_RESET |
   15002                 :            :               (EEPROM_DEFAULT_CLOCK_PERIOD <<
   15003                 :            :                EEPROM_ADDR_CLKPERD_SHIFT)));
   15004                 :            : 
   15005                 :          0 :         msleep(1);
   15006                 :            : 
   15007                 :            :         /* Enable seeprom accesses. */
   15008                 :          0 :         tw32_f(GRC_LOCAL_CTRL,
   15009                 :            :              tr32(GRC_LOCAL_CTRL) | GRC_LCLCTRL_AUTO_SEEPROM);
   15010                 :          0 :         udelay(100);
   15011                 :            : 
   15012         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5700 &&
   15013                 :            :             tg3_asic_rev(tp) != ASIC_REV_5701) {
   15014                 :          0 :                 tg3_flag_set(tp, NVRAM);
   15015                 :            : 
   15016         [ #  # ]:          0 :                 if (tg3_nvram_lock(tp)) {
   15017                 :          0 :                         netdev_warn(tp->dev,
   15018                 :            :                                     "Cannot get nvram lock, %s failed\n",
   15019                 :            :                                     __func__);
   15020                 :          0 :                         return;
   15021                 :            :                 }
   15022                 :          0 :                 tg3_enable_nvram_access(tp);
   15023                 :            : 
   15024                 :          0 :                 tp->nvram_size = 0;
   15025                 :            : 
   15026         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5752)
   15027                 :          0 :                         tg3_get_5752_nvram_info(tp);
   15028         [ #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_5755)
   15029                 :          0 :                         tg3_get_5755_nvram_info(tp);
   15030         [ #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_5787 ||
   15031         [ #  # ]:          0 :                          tg3_asic_rev(tp) == ASIC_REV_5784 ||
   15032                 :            :                          tg3_asic_rev(tp) == ASIC_REV_5785)
   15033                 :          0 :                         tg3_get_5787_nvram_info(tp);
   15034         [ #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_5761)
   15035                 :          0 :                         tg3_get_5761_nvram_info(tp);
   15036         [ #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_5906)
   15037                 :          0 :                         tg3_get_5906_nvram_info(tp);
   15038   [ #  #  #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_57780 ||
   15039                 :            :                          tg3_flag(tp, 57765_CLASS))
   15040                 :          0 :                         tg3_get_57780_nvram_info(tp);
   15041         [ #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   15042                 :            :                          tg3_asic_rev(tp) == ASIC_REV_5719)
   15043                 :          0 :                         tg3_get_5717_nvram_info(tp);
   15044         [ #  # ]:          0 :                 else if (tg3_asic_rev(tp) == ASIC_REV_5720 ||
   15045                 :            :                          tg3_asic_rev(tp) == ASIC_REV_5762)
   15046                 :          0 :                         tg3_get_5720_nvram_info(tp);
   15047                 :            :                 else
   15048                 :          0 :                         tg3_get_nvram_info(tp);
   15049                 :            : 
   15050         [ #  # ]:          0 :                 if (tp->nvram_size == 0)
   15051                 :          0 :                         tg3_get_nvram_size(tp);
   15052                 :            : 
   15053                 :          0 :                 tg3_disable_nvram_access(tp);
   15054                 :          0 :                 tg3_nvram_unlock(tp);
   15055                 :            : 
   15056                 :            :         } else {
   15057                 :          0 :                 tg3_flag_clear(tp, NVRAM);
   15058                 :          0 :                 tg3_flag_clear(tp, NVRAM_BUFFERED);
   15059                 :            : 
   15060                 :          0 :                 tg3_get_eeprom_size(tp);
   15061                 :            :         }
   15062                 :            : }
   15063                 :            : 
   15064                 :            : struct subsys_tbl_ent {
   15065                 :            :         u16 subsys_vendor, subsys_devid;
   15066                 :            :         u32 phy_id;
   15067                 :            : };
   15068                 :            : 
   15069                 :            : static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
   15070                 :            :         /* Broadcom boards. */
   15071                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15072                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6, TG3_PHY_ID_BCM5401 },
   15073                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15074                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95701A5, TG3_PHY_ID_BCM5701 },
   15075                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15076                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95700T6, TG3_PHY_ID_BCM8002 },
   15077                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15078                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95700A9, 0 },
   15079                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15080                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95701T1, TG3_PHY_ID_BCM5701 },
   15081                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15082                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95701T8, TG3_PHY_ID_BCM5701 },
   15083                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15084                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95701A7, 0 },
   15085                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15086                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95701A10, TG3_PHY_ID_BCM5701 },
   15087                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15088                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95701A12, TG3_PHY_ID_BCM5701 },
   15089                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15090                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX1, TG3_PHY_ID_BCM5703 },
   15091                 :            :         { TG3PCI_SUBVENDOR_ID_BROADCOM,
   15092                 :            :           TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX2, TG3_PHY_ID_BCM5703 },
   15093                 :            : 
   15094                 :            :         /* 3com boards. */
   15095                 :            :         { TG3PCI_SUBVENDOR_ID_3COM,
   15096                 :            :           TG3PCI_SUBDEVICE_ID_3COM_3C996T, TG3_PHY_ID_BCM5401 },
   15097                 :            :         { TG3PCI_SUBVENDOR_ID_3COM,
   15098                 :            :           TG3PCI_SUBDEVICE_ID_3COM_3C996BT, TG3_PHY_ID_BCM5701 },
   15099                 :            :         { TG3PCI_SUBVENDOR_ID_3COM,
   15100                 :            :           TG3PCI_SUBDEVICE_ID_3COM_3C996SX, 0 },
   15101                 :            :         { TG3PCI_SUBVENDOR_ID_3COM,
   15102                 :            :           TG3PCI_SUBDEVICE_ID_3COM_3C1000T, TG3_PHY_ID_BCM5701 },
   15103                 :            :         { TG3PCI_SUBVENDOR_ID_3COM,
   15104                 :            :           TG3PCI_SUBDEVICE_ID_3COM_3C940BR01, TG3_PHY_ID_BCM5701 },
   15105                 :            : 
   15106                 :            :         /* DELL boards. */
   15107                 :            :         { TG3PCI_SUBVENDOR_ID_DELL,
   15108                 :            :           TG3PCI_SUBDEVICE_ID_DELL_VIPER, TG3_PHY_ID_BCM5401 },
   15109                 :            :         { TG3PCI_SUBVENDOR_ID_DELL,
   15110                 :            :           TG3PCI_SUBDEVICE_ID_DELL_JAGUAR, TG3_PHY_ID_BCM5401 },
   15111                 :            :         { TG3PCI_SUBVENDOR_ID_DELL,
   15112                 :            :           TG3PCI_SUBDEVICE_ID_DELL_MERLOT, TG3_PHY_ID_BCM5411 },
   15113                 :            :         { TG3PCI_SUBVENDOR_ID_DELL,
   15114                 :            :           TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT, TG3_PHY_ID_BCM5411 },
   15115                 :            : 
   15116                 :            :         /* Compaq boards. */
   15117                 :            :         { TG3PCI_SUBVENDOR_ID_COMPAQ,
   15118                 :            :           TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE, TG3_PHY_ID_BCM5701 },
   15119                 :            :         { TG3PCI_SUBVENDOR_ID_COMPAQ,
   15120                 :            :           TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2, TG3_PHY_ID_BCM5701 },
   15121                 :            :         { TG3PCI_SUBVENDOR_ID_COMPAQ,
   15122                 :            :           TG3PCI_SUBDEVICE_ID_COMPAQ_CHANGELING, 0 },
   15123                 :            :         { TG3PCI_SUBVENDOR_ID_COMPAQ,
   15124                 :            :           TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780, TG3_PHY_ID_BCM5701 },
   15125                 :            :         { TG3PCI_SUBVENDOR_ID_COMPAQ,
   15126                 :            :           TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780_2, TG3_PHY_ID_BCM5701 },
   15127                 :            : 
   15128                 :            :         /* IBM boards. */
   15129                 :            :         { TG3PCI_SUBVENDOR_ID_IBM,
   15130                 :            :           TG3PCI_SUBDEVICE_ID_IBM_5703SAX2, 0 }
   15131                 :            : };
   15132                 :            : 
   15133                 :            : static struct subsys_tbl_ent *tg3_lookup_by_subsys(struct tg3 *tp)
   15134                 :            : {
   15135                 :            :         int i;
   15136                 :            : 
   15137         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(subsys_id_to_phy_id); i++) {
   15138                 :          0 :                 if ((subsys_id_to_phy_id[i].subsys_vendor ==
   15139         [ #  # ]:          0 :                      tp->pdev->subsystem_vendor) &&
   15140                 :          0 :                     (subsys_id_to_phy_id[i].subsys_devid ==
   15141         [ #  # ]:          0 :                      tp->pdev->subsystem_device))
   15142                 :          0 :                         return &subsys_id_to_phy_id[i];
   15143                 :            :         }
   15144                 :            :         return NULL;
   15145                 :            : }
   15146                 :            : 
   15147                 :          0 : static void tg3_get_eeprom_hw_cfg(struct tg3 *tp)
   15148                 :            : {
   15149                 :          0 :         u32 val;
   15150                 :            : 
   15151                 :          0 :         tp->phy_id = TG3_PHY_ID_INVALID;
   15152                 :          0 :         tp->led_ctrl = LED_CTRL_MODE_PHY_1;
   15153                 :            : 
   15154                 :            :         /* Assume an onboard device and WOL capable by default.  */
   15155                 :          0 :         tg3_flag_set(tp, EEPROM_WRITE_PROT);
   15156                 :          0 :         tg3_flag_set(tp, WOL_CAP);
   15157                 :            : 
   15158         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
   15159         [ #  # ]:          0 :                 if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM)) {
   15160                 :          0 :                         tg3_flag_clear(tp, EEPROM_WRITE_PROT);
   15161                 :          0 :                         tg3_flag_set(tp, IS_NIC);
   15162                 :            :                 }
   15163                 :          0 :                 val = tr32(VCPU_CFGSHDW);
   15164         [ #  # ]:          0 :                 if (val & VCPU_CFGSHDW_ASPM_DBNC)
   15165                 :          0 :                         tg3_flag_set(tp, ASPM_WORKAROUND);
   15166         [ #  # ]:          0 :                 if ((val & VCPU_CFGSHDW_WOL_ENABLE) &&
   15167                 :            :                     (val & VCPU_CFGSHDW_WOL_MAGPKT)) {
   15168                 :          0 :                         tg3_flag_set(tp, WOL_ENABLE);
   15169                 :          0 :                         device_set_wakeup_enable(&tp->pdev->dev, true);
   15170                 :            :                 }
   15171                 :          0 :                 goto done;
   15172                 :            :         }
   15173                 :            : 
   15174                 :          0 :         tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
   15175         [ #  # ]:          0 :         if (val == NIC_SRAM_DATA_SIG_MAGIC) {
   15176                 :          0 :                 u32 nic_cfg, led_cfg;
   15177                 :          0 :                 u32 cfg2 = 0, cfg4 = 0, cfg5 = 0;
   15178                 :          0 :                 u32 nic_phy_id, ver, eeprom_phy_id;
   15179                 :          0 :                 int eeprom_phy_serdes = 0;
   15180                 :            : 
   15181                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
   15182                 :          0 :                 tp->nic_sram_data_cfg = nic_cfg;
   15183                 :            : 
   15184                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_DATA_VER, &ver);
   15185                 :          0 :                 ver >>= NIC_SRAM_DATA_VER_SHIFT;
   15186         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) != ASIC_REV_5700 &&
   15187         [ #  # ]:          0 :                     tg3_asic_rev(tp) != ASIC_REV_5701 &&
   15188         [ #  # ]:          0 :                     tg3_asic_rev(tp) != ASIC_REV_5703 &&
   15189         [ #  # ]:          0 :                     (ver > 0) && (ver < 0x100))
   15190                 :          0 :                         tg3_read_mem(tp, NIC_SRAM_DATA_CFG_2, &cfg2);
   15191                 :            : 
   15192         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5785)
   15193                 :          0 :                         tg3_read_mem(tp, NIC_SRAM_DATA_CFG_4, &cfg4);
   15194                 :            : 
   15195         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   15196         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5719 ||
   15197                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5720)
   15198                 :          0 :                         tg3_read_mem(tp, NIC_SRAM_DATA_CFG_5, &cfg5);
   15199                 :            : 
   15200         [ #  # ]:          0 :                 if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) ==
   15201                 :            :                     NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER)
   15202                 :          0 :                         eeprom_phy_serdes = 1;
   15203                 :            : 
   15204                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_DATA_PHY_ID, &nic_phy_id);
   15205         [ #  # ]:          0 :                 if (nic_phy_id != 0) {
   15206                 :          0 :                         u32 id1 = nic_phy_id & NIC_SRAM_DATA_PHY_ID1_MASK;
   15207                 :          0 :                         u32 id2 = nic_phy_id & NIC_SRAM_DATA_PHY_ID2_MASK;
   15208                 :            : 
   15209                 :          0 :                         eeprom_phy_id  = (id1 >> 16) << 10;
   15210                 :          0 :                         eeprom_phy_id |= (id2 & 0xfc00) << 16;
   15211                 :          0 :                         eeprom_phy_id |= (id2 & 0x03ff) <<  0;
   15212                 :            :                 } else
   15213                 :            :                         eeprom_phy_id = 0;
   15214                 :            : 
   15215                 :          0 :                 tp->phy_id = eeprom_phy_id;
   15216         [ #  # ]:          0 :                 if (eeprom_phy_serdes) {
   15217         [ #  # ]:          0 :                         if (!tg3_flag(tp, 5705_PLUS))
   15218                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
   15219                 :            :                         else
   15220                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_MII_SERDES;
   15221                 :            :                 }
   15222                 :            : 
   15223         [ #  # ]:          0 :                 if (tg3_flag(tp, 5750_PLUS))
   15224                 :          0 :                         led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK |
   15225                 :            :                                     SHASTA_EXT_LED_MODE_MASK);
   15226                 :            :                 else
   15227                 :          0 :                         led_cfg = nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK;
   15228                 :            : 
   15229   [ #  #  #  #  :          0 :                 switch (led_cfg) {
                   #  # ]
   15230                 :          0 :                 default:
   15231                 :            :                 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_1:
   15232                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_PHY_1;
   15233                 :          0 :                         break;
   15234                 :            : 
   15235                 :          0 :                 case NIC_SRAM_DATA_CFG_LED_MODE_PHY_2:
   15236                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_PHY_2;
   15237                 :          0 :                         break;
   15238                 :            : 
   15239                 :          0 :                 case NIC_SRAM_DATA_CFG_LED_MODE_MAC:
   15240                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_MAC;
   15241                 :            : 
   15242                 :            :                         /* Default to PHY_1_MODE if 0 (MAC_MODE) is
   15243                 :            :                          * read on some older 5700/5701 bootcode.
   15244                 :            :                          */
   15245         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   15246                 :            :                             tg3_asic_rev(tp) == ASIC_REV_5701)
   15247                 :          0 :                                 tp->led_ctrl = LED_CTRL_MODE_PHY_1;
   15248                 :            : 
   15249                 :            :                         break;
   15250                 :            : 
   15251                 :          0 :                 case SHASTA_EXT_LED_SHARED:
   15252                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_SHARED;
   15253         [ #  # ]:          0 :                         if (tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0 &&
   15254                 :            :                             tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A1)
   15255                 :          0 :                                 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
   15256                 :            :                                                  LED_CTRL_MODE_PHY_2);
   15257                 :            : 
   15258         [ #  # ]:          0 :                         if (tg3_flag(tp, 5717_PLUS) ||
   15259         [ #  # ]:          0 :                             tg3_asic_rev(tp) == ASIC_REV_5762)
   15260                 :          0 :                                 tp->led_ctrl |= LED_CTRL_BLINK_RATE_OVERRIDE |
   15261                 :            :                                                 LED_CTRL_BLINK_RATE_MASK;
   15262                 :            : 
   15263                 :            :                         break;
   15264                 :            : 
   15265                 :          0 :                 case SHASTA_EXT_LED_MAC:
   15266                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_SHASTA_MAC;
   15267                 :          0 :                         break;
   15268                 :            : 
   15269                 :          0 :                 case SHASTA_EXT_LED_COMBO:
   15270                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_COMBO;
   15271         [ #  # ]:          0 :                         if (tg3_chip_rev_id(tp) != CHIPREV_ID_5750_A0)
   15272                 :          0 :                                 tp->led_ctrl |= (LED_CTRL_MODE_PHY_1 |
   15273                 :            :                                                  LED_CTRL_MODE_PHY_2);
   15274                 :            :                         break;
   15275                 :            : 
   15276                 :            :                 }
   15277                 :            : 
   15278         [ #  # ]:          0 :                 if ((tg3_asic_rev(tp) == ASIC_REV_5700 ||
   15279                 :          0 :                      tg3_asic_rev(tp) == ASIC_REV_5701) &&
   15280         [ #  # ]:          0 :                     tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
   15281                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_PHY_2;
   15282                 :            : 
   15283         [ #  # ]:          0 :                 if (tg3_chip_rev(tp) == CHIPREV_5784_AX)
   15284                 :          0 :                         tp->led_ctrl = LED_CTRL_MODE_PHY_1;
   15285                 :            : 
   15286         [ #  # ]:          0 :                 if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) {
   15287                 :          0 :                         tg3_flag_set(tp, EEPROM_WRITE_PROT);
   15288         [ #  # ]:          0 :                         if ((tp->pdev->subsystem_vendor ==
   15289                 :          0 :                              PCI_VENDOR_ID_ARIMA) &&
   15290         [ #  # ]:          0 :                             (tp->pdev->subsystem_device == 0x205a ||
   15291                 :            :                              tp->pdev->subsystem_device == 0x2063))
   15292                 :          0 :                                 tg3_flag_clear(tp, EEPROM_WRITE_PROT);
   15293                 :            :                 } else {
   15294                 :          0 :                         tg3_flag_clear(tp, EEPROM_WRITE_PROT);
   15295                 :          0 :                         tg3_flag_set(tp, IS_NIC);
   15296                 :            :                 }
   15297                 :            : 
   15298         [ #  # ]:          0 :                 if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
   15299                 :          0 :                         tg3_flag_set(tp, ENABLE_ASF);
   15300         [ #  # ]:          0 :                         if (tg3_flag(tp, 5750_PLUS))
   15301                 :          0 :                                 tg3_flag_set(tp, ASF_NEW_HANDSHAKE);
   15302                 :            :                 }
   15303                 :            : 
   15304   [ #  #  #  # ]:          0 :                 if ((nic_cfg & NIC_SRAM_DATA_CFG_APE_ENABLE) &&
   15305                 :            :                     tg3_flag(tp, 5750_PLUS))
   15306                 :          0 :                         tg3_flag_set(tp, ENABLE_APE);
   15307                 :            : 
   15308         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES &&
   15309         [ #  # ]:          0 :                     !(nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL))
   15310                 :          0 :                         tg3_flag_clear(tp, WOL_CAP);
   15311                 :            : 
   15312         [ #  # ]:          0 :                 if (tg3_flag(tp, WOL_CAP) &&
   15313         [ #  # ]:          0 :                     (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) {
   15314                 :          0 :                         tg3_flag_set(tp, WOL_ENABLE);
   15315                 :          0 :                         device_set_wakeup_enable(&tp->pdev->dev, true);
   15316                 :            :                 }
   15317                 :            : 
   15318         [ #  # ]:          0 :                 if (cfg2 & (1 << 17))
   15319                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING;
   15320                 :            : 
   15321                 :            :                 /* serdes signal pre-emphasis in register 0x590 set by */
   15322                 :            :                 /* bootcode if bit 18 is set */
   15323         [ #  # ]:          0 :                 if (cfg2 & (1 << 18))
   15324                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_SERDES_PREEMPHASIS;
   15325                 :            : 
   15326         [ #  # ]:          0 :                 if ((tg3_flag(tp, 57765_PLUS) ||
   15327         [ #  # ]:          0 :                      (tg3_asic_rev(tp) == ASIC_REV_5784 &&
   15328         [ #  # ]:          0 :                       tg3_chip_rev(tp) != CHIPREV_5784_AX)) &&
   15329         [ #  # ]:          0 :                     (cfg2 & NIC_SRAM_DATA_CFG_2_APD_EN))
   15330                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_ENABLE_APD;
   15331                 :            : 
   15332         [ #  # ]:          0 :                 if (tg3_flag(tp, PCI_EXPRESS)) {
   15333                 :          0 :                         u32 cfg3;
   15334                 :            : 
   15335                 :          0 :                         tg3_read_mem(tp, NIC_SRAM_DATA_CFG_3, &cfg3);
   15336   [ #  #  #  # ]:          0 :                         if (tg3_asic_rev(tp) != ASIC_REV_5785 &&
   15337                 :          0 :                             !tg3_flag(tp, 57765_PLUS) &&
   15338         [ #  # ]:          0 :                             (cfg3 & NIC_SRAM_ASPM_DEBOUNCE))
   15339                 :          0 :                                 tg3_flag_set(tp, ASPM_WORKAROUND);
   15340         [ #  # ]:          0 :                         if (cfg3 & NIC_SRAM_LNK_FLAP_AVOID)
   15341                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_KEEP_LINK_ON_PWRDN;
   15342         [ #  # ]:          0 :                         if (cfg3 & NIC_SRAM_1G_ON_VAUX_OK)
   15343                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_1G_ON_VAUX_OK;
   15344                 :            :                 }
   15345                 :            : 
   15346         [ #  # ]:          0 :                 if (cfg4 & NIC_SRAM_RGMII_INBAND_DISABLE)
   15347                 :          0 :                         tg3_flag_set(tp, RGMII_INBAND_DISABLE);
   15348         [ #  # ]:          0 :                 if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_RX_EN)
   15349                 :          0 :                         tg3_flag_set(tp, RGMII_EXT_IBND_RX_EN);
   15350         [ #  # ]:          0 :                 if (cfg4 & NIC_SRAM_RGMII_EXT_IBND_TX_EN)
   15351                 :          0 :                         tg3_flag_set(tp, RGMII_EXT_IBND_TX_EN);
   15352                 :            : 
   15353         [ #  # ]:          0 :                 if (cfg5 & NIC_SRAM_DISABLE_1G_HALF_ADV)
   15354                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_DISABLE_1G_HD_ADV;
   15355                 :            :         }
   15356                 :          0 : done:
   15357         [ #  # ]:          0 :         if (tg3_flag(tp, WOL_CAP))
   15358                 :          0 :                 device_set_wakeup_enable(&tp->pdev->dev,
   15359                 :            :                                          tg3_flag(tp, WOL_ENABLE));
   15360                 :            :         else
   15361                 :          0 :                 device_set_wakeup_capable(&tp->pdev->dev, false);
   15362                 :          0 : }
   15363                 :            : 
   15364                 :          0 : static int tg3_ape_otp_read(struct tg3 *tp, u32 offset, u32 *val)
   15365                 :            : {
   15366                 :          0 :         int i, err;
   15367                 :          0 :         u32 val2, off = offset * 8;
   15368                 :            : 
   15369                 :          0 :         err = tg3_nvram_lock(tp);
   15370         [ #  # ]:          0 :         if (err)
   15371                 :            :                 return err;
   15372                 :            : 
   15373                 :          0 :         tg3_ape_write32(tp, TG3_APE_OTP_ADDR, off | APE_OTP_ADDR_CPU_ENABLE);
   15374                 :          0 :         tg3_ape_write32(tp, TG3_APE_OTP_CTRL, APE_OTP_CTRL_PROG_EN |
   15375                 :            :                         APE_OTP_CTRL_CMD_RD | APE_OTP_CTRL_START);
   15376                 :          0 :         tg3_ape_read32(tp, TG3_APE_OTP_CTRL);
   15377                 :          0 :         udelay(10);
   15378                 :            : 
   15379         [ #  # ]:          0 :         for (i = 0; i < 100; i++) {
   15380                 :          0 :                 val2 = tg3_ape_read32(tp, TG3_APE_OTP_STATUS);
   15381         [ #  # ]:          0 :                 if (val2 & APE_OTP_STATUS_CMD_DONE) {
   15382                 :          0 :                         *val = tg3_ape_read32(tp, TG3_APE_OTP_RD_DATA);
   15383                 :          0 :                         break;
   15384                 :            :                 }
   15385                 :          0 :                 udelay(10);
   15386                 :            :         }
   15387                 :            : 
   15388                 :          0 :         tg3_ape_write32(tp, TG3_APE_OTP_CTRL, 0);
   15389                 :            : 
   15390                 :          0 :         tg3_nvram_unlock(tp);
   15391         [ #  # ]:          0 :         if (val2 & APE_OTP_STATUS_CMD_DONE)
   15392                 :          0 :                 return 0;
   15393                 :            : 
   15394                 :            :         return -EBUSY;
   15395                 :            : }
   15396                 :            : 
   15397                 :          0 : static int tg3_issue_otp_command(struct tg3 *tp, u32 cmd)
   15398                 :            : {
   15399                 :          0 :         int i;
   15400                 :          0 :         u32 val;
   15401                 :            : 
   15402                 :          0 :         tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START);
   15403                 :          0 :         tw32(OTP_CTRL, cmd);
   15404                 :            : 
   15405                 :            :         /* Wait for up to 1 ms for command to execute. */
   15406         [ #  # ]:          0 :         for (i = 0; i < 100; i++) {
   15407                 :          0 :                 val = tr32(OTP_STATUS);
   15408         [ #  # ]:          0 :                 if (val & OTP_STATUS_CMD_DONE)
   15409                 :            :                         break;
   15410                 :          0 :                 udelay(10);
   15411                 :            :         }
   15412                 :            : 
   15413         [ #  # ]:          0 :         return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY;
   15414                 :            : }
   15415                 :            : 
   15416                 :            : /* Read the gphy configuration from the OTP region of the chip.  The gphy
   15417                 :            :  * configuration is a 32-bit value that straddles the alignment boundary.
   15418                 :            :  * We do two 32-bit reads and then shift and merge the results.
   15419                 :            :  */
   15420                 :          0 : static u32 tg3_read_otp_phycfg(struct tg3 *tp)
   15421                 :            : {
   15422                 :          0 :         u32 bhalf_otp, thalf_otp;
   15423                 :            : 
   15424                 :          0 :         tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC);
   15425                 :            : 
   15426         [ #  # ]:          0 :         if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT))
   15427                 :            :                 return 0;
   15428                 :            : 
   15429                 :          0 :         tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1);
   15430                 :            : 
   15431         [ #  # ]:          0 :         if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
   15432                 :            :                 return 0;
   15433                 :            : 
   15434                 :          0 :         thalf_otp = tr32(OTP_READ_DATA);
   15435                 :            : 
   15436                 :          0 :         tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2);
   15437                 :            : 
   15438         [ #  # ]:          0 :         if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
   15439                 :            :                 return 0;
   15440                 :            : 
   15441                 :          0 :         bhalf_otp = tr32(OTP_READ_DATA);
   15442                 :            : 
   15443                 :          0 :         return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);
   15444                 :            : }
   15445                 :            : 
   15446                 :          0 : static void tg3_phy_init_link_config(struct tg3 *tp)
   15447                 :            : {
   15448                 :          0 :         u32 adv = ADVERTISED_Autoneg;
   15449                 :            : 
   15450                 :          0 :         if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
   15451         [ #  # ]:          0 :                 if (!(tp->phy_flags & TG3_PHYFLG_DISABLE_1G_HD_ADV))
   15452                 :          0 :                         adv |= ADVERTISED_1000baseT_Half;
   15453                 :          0 :                 adv |= ADVERTISED_1000baseT_Full;
   15454                 :            :         }
   15455                 :            : 
   15456         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
   15457                 :          0 :                 adv |= ADVERTISED_100baseT_Half |
   15458                 :            :                        ADVERTISED_100baseT_Full |
   15459                 :            :                        ADVERTISED_10baseT_Half |
   15460                 :            :                        ADVERTISED_10baseT_Full |
   15461                 :            :                        ADVERTISED_TP;
   15462                 :            :         else
   15463                 :          0 :                 adv |= ADVERTISED_FIBRE;
   15464                 :            : 
   15465                 :          0 :         tp->link_config.advertising = adv;
   15466                 :          0 :         tp->link_config.speed = SPEED_UNKNOWN;
   15467                 :          0 :         tp->link_config.duplex = DUPLEX_UNKNOWN;
   15468                 :          0 :         tp->link_config.autoneg = AUTONEG_ENABLE;
   15469                 :          0 :         tp->link_config.active_speed = SPEED_UNKNOWN;
   15470                 :          0 :         tp->link_config.active_duplex = DUPLEX_UNKNOWN;
   15471                 :            : 
   15472                 :          0 :         tp->old_link = -1;
   15473                 :            : }
   15474                 :            : 
   15475                 :          0 : static int tg3_phy_probe(struct tg3 *tp)
   15476                 :            : {
   15477                 :          0 :         u32 hw_phy_id_1, hw_phy_id_2;
   15478                 :          0 :         u32 hw_phy_id, hw_phy_id_masked;
   15479                 :          0 :         int err;
   15480                 :            : 
   15481                 :            :         /* flow control autonegotiation is default behavior */
   15482                 :          0 :         tg3_flag_set(tp, PAUSE_AUTONEG);
   15483                 :          0 :         tp->link_config.flowctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
   15484                 :            : 
   15485         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE)) {
   15486   [ #  #  #  #  :          0 :                 switch (tp->pci_fn) {
                      # ]
   15487                 :          0 :                 case 0:
   15488                 :          0 :                         tp->phy_ape_lock = TG3_APE_LOCK_PHY0;
   15489                 :          0 :                         break;
   15490                 :          0 :                 case 1:
   15491                 :          0 :                         tp->phy_ape_lock = TG3_APE_LOCK_PHY1;
   15492                 :          0 :                         break;
   15493                 :          0 :                 case 2:
   15494                 :          0 :                         tp->phy_ape_lock = TG3_APE_LOCK_PHY2;
   15495                 :          0 :                         break;
   15496                 :          0 :                 case 3:
   15497                 :          0 :                         tp->phy_ape_lock = TG3_APE_LOCK_PHY3;
   15498                 :          0 :                         break;
   15499                 :            :                 }
   15500                 :          0 :         }
   15501                 :            : 
   15502         [ #  # ]:          0 :         if (!tg3_flag(tp, ENABLE_ASF) &&
   15503         [ #  # ]:          0 :             !(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
   15504                 :            :             !(tp->phy_flags & TG3_PHYFLG_10_100_ONLY))
   15505                 :          0 :                 tp->phy_flags &= ~(TG3_PHYFLG_1G_ON_VAUX_OK |
   15506                 :            :                                    TG3_PHYFLG_KEEP_LINK_ON_PWRDN);
   15507                 :            : 
   15508         [ #  # ]:          0 :         if (tg3_flag(tp, USE_PHYLIB))
   15509                 :          0 :                 return tg3_phy_init(tp);
   15510                 :            : 
   15511                 :            :         /* Reading the PHY ID register can conflict with ASF
   15512                 :            :          * firmware access to the PHY hardware.
   15513                 :            :          */
   15514                 :          0 :         err = 0;
   15515   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE)) {
   15516                 :            :                 hw_phy_id = hw_phy_id_masked = TG3_PHY_ID_INVALID;
   15517                 :            :         } else {
   15518                 :            :                 /* Now read the physical PHY_ID from the chip and verify
   15519                 :            :                  * that it is sane.  If it doesn't look good, we fall back
   15520                 :            :                  * to either the hard-coded table based PHY_ID and failing
   15521                 :            :                  * that the value found in the eeprom area.
   15522                 :            :                  */
   15523                 :          0 :                 err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
   15524                 :          0 :                 err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
   15525                 :            : 
   15526                 :          0 :                 hw_phy_id  = (hw_phy_id_1 & 0xffff) << 10;
   15527                 :          0 :                 hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
   15528                 :          0 :                 hw_phy_id |= (hw_phy_id_2 & 0x03ff) <<  0;
   15529                 :            : 
   15530                 :          0 :                 hw_phy_id_masked = hw_phy_id & TG3_PHY_ID_MASK;
   15531                 :            :         }
   15532                 :            : 
   15533   [ #  #  #  #  :          0 :         if (!err && TG3_KNOWN_PHY_ID(hw_phy_id_masked)) {
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
   15534                 :          0 :                 tp->phy_id = hw_phy_id;
   15535         [ #  # ]:          0 :                 if (hw_phy_id_masked == TG3_PHY_ID_BCM8002)
   15536                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
   15537                 :            :                 else
   15538                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_PHY_SERDES;
   15539                 :            :         } else {
   15540         [ #  # ]:          0 :                 if (tp->phy_id != TG3_PHY_ID_INVALID) {
   15541                 :            :                         /* Do nothing, phy ID already set up in
   15542                 :            :                          * tg3_get_eeprom_hw_cfg().
   15543                 :            :                          */
   15544                 :            :                 } else {
   15545                 :            :                         struct subsys_tbl_ent *p;
   15546                 :            : 
   15547                 :            :                         /* No eeprom signature?  Try the hardcoded
   15548                 :            :                          * subsys device table.
   15549                 :            :                          */
   15550                 :            :                         p = tg3_lookup_by_subsys(tp);
   15551         [ #  # ]:          0 :                         if (p) {
   15552                 :          0 :                                 tp->phy_id = p->phy_id;
   15553         [ #  # ]:          0 :                         } else if (!tg3_flag(tp, IS_SSB_CORE)) {
   15554                 :            :                                 /* For now we saw the IDs 0xbc050cd0,
   15555                 :            :                                  * 0xbc050f80 and 0xbc050c30 on devices
   15556                 :            :                                  * connected to an BCM4785 and there are
   15557                 :            :                                  * probably more. Just assume that the phy is
   15558                 :            :                                  * supported when it is connected to a SSB core
   15559                 :            :                                  * for now.
   15560                 :            :                                  */
   15561                 :            :                                 return -ENODEV;
   15562                 :            :                         }
   15563                 :            : 
   15564         [ #  # ]:          0 :                         if (!tp->phy_id ||
   15565                 :            :                             tp->phy_id == TG3_PHY_ID_BCM8002)
   15566                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
   15567                 :            :                 }
   15568                 :            :         }
   15569                 :            : 
   15570         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
   15571         [ #  # ]:          0 :             (tg3_asic_rev(tp) == ASIC_REV_5719 ||
   15572         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_5720 ||
   15573         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_57766 ||
   15574         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_5762 ||
   15575         [ #  # ]:          0 :              (tg3_asic_rev(tp) == ASIC_REV_5717 &&
   15576         [ #  # ]:          0 :               tg3_chip_rev_id(tp) != CHIPREV_ID_5717_A0) ||
   15577         [ #  # ]:          0 :              (tg3_asic_rev(tp) == ASIC_REV_57765 &&
   15578                 :            :               tg3_chip_rev_id(tp) != CHIPREV_ID_57765_A0))) {
   15579                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_EEE_CAP;
   15580                 :            : 
   15581                 :          0 :                 tp->eee.supported = SUPPORTED_100baseT_Full |
   15582                 :            :                                     SUPPORTED_1000baseT_Full;
   15583                 :          0 :                 tp->eee.advertised = ADVERTISED_100baseT_Full |
   15584                 :            :                                      ADVERTISED_1000baseT_Full;
   15585                 :          0 :                 tp->eee.eee_enabled = 1;
   15586                 :          0 :                 tp->eee.tx_lpi_enabled = 1;
   15587                 :          0 :                 tp->eee.tx_lpi_timer = TG3_CPMU_DBTMR1_LNKIDLE_2047US;
   15588                 :            :         }
   15589                 :            : 
   15590         [ #  # ]:          0 :         tg3_phy_init_link_config(tp);
   15591                 :            : 
   15592         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN) &&
   15593         [ #  # ]:          0 :             !(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
   15594         [ #  # ]:          0 :             !tg3_flag(tp, ENABLE_APE) &&
   15595                 :            :             !tg3_flag(tp, ENABLE_ASF)) {
   15596                 :          0 :                 u32 bmsr, dummy;
   15597                 :            : 
   15598                 :          0 :                 tg3_readphy(tp, MII_BMSR, &bmsr);
   15599         [ #  # ]:          0 :                 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
   15600         [ #  # ]:          0 :                     (bmsr & BMSR_LSTATUS))
   15601                 :          0 :                         goto skip_phy_reset;
   15602                 :            : 
   15603                 :          0 :                 err = tg3_phy_reset(tp);
   15604         [ #  # ]:          0 :                 if (err)
   15605                 :          0 :                         return err;
   15606                 :            : 
   15607                 :          0 :                 tg3_phy_set_wirespeed(tp);
   15608                 :            : 
   15609         [ #  # ]:          0 :                 if (!tg3_phy_copper_an_config_ok(tp, &dummy)) {
   15610                 :          0 :                         tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
   15611                 :          0 :                                             tp->link_config.flowctrl);
   15612                 :            : 
   15613                 :          0 :                         tg3_writephy(tp, MII_BMCR,
   15614                 :            :                                      BMCR_ANENABLE | BMCR_ANRESTART);
   15615                 :            :                 }
   15616                 :            :         }
   15617                 :            : 
   15618                 :          0 : skip_phy_reset:
   15619         [ #  # ]:          0 :         if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
   15620                 :          0 :                 err = tg3_init_5401phy_dsp(tp);
   15621         [ #  # ]:          0 :                 if (err)
   15622                 :            :                         return err;
   15623                 :            : 
   15624                 :          0 :                 err = tg3_init_5401phy_dsp(tp);
   15625                 :            :         }
   15626                 :            : 
   15627                 :            :         return err;
   15628                 :            : }
   15629                 :            : 
   15630                 :          0 : static void tg3_read_vpd(struct tg3 *tp)
   15631                 :            : {
   15632                 :          0 :         u8 *vpd_data;
   15633                 :          0 :         unsigned int block_end, rosize, len;
   15634                 :          0 :         u32 vpdlen;
   15635                 :          0 :         int j, i = 0;
   15636                 :            : 
   15637                 :          0 :         vpd_data = (u8 *)tg3_vpd_readblock(tp, &vpdlen);
   15638         [ #  # ]:          0 :         if (!vpd_data)
   15639                 :          0 :                 goto out_no_vpd;
   15640                 :            : 
   15641                 :          0 :         i = pci_vpd_find_tag(vpd_data, 0, vpdlen, PCI_VPD_LRDT_RO_DATA);
   15642         [ #  # ]:          0 :         if (i < 0)
   15643                 :          0 :                 goto out_not_found;
   15644                 :            : 
   15645         [ #  # ]:          0 :         rosize = pci_vpd_lrdt_size(&vpd_data[i]);
   15646                 :          0 :         block_end = i + PCI_VPD_LRDT_TAG_SIZE + rosize;
   15647                 :          0 :         i += PCI_VPD_LRDT_TAG_SIZE;
   15648                 :            : 
   15649         [ #  # ]:          0 :         if (block_end > vpdlen)
   15650                 :          0 :                 goto out_not_found;
   15651                 :            : 
   15652                 :          0 :         j = pci_vpd_find_info_keyword(vpd_data, i, rosize,
   15653                 :            :                                       PCI_VPD_RO_KEYWORD_MFR_ID);
   15654         [ #  # ]:          0 :         if (j > 0) {
   15655         [ #  # ]:          0 :                 len = pci_vpd_info_field_size(&vpd_data[j]);
   15656                 :            : 
   15657                 :          0 :                 j += PCI_VPD_INFO_FLD_HDR_SIZE;
   15658   [ #  #  #  # ]:          0 :                 if (j + len > block_end || len != 4 ||
   15659         [ #  # ]:          0 :                     memcmp(&vpd_data[j], "1028", 4))
   15660                 :          0 :                         goto partno;
   15661                 :            : 
   15662                 :          0 :                 j = pci_vpd_find_info_keyword(vpd_data, i, rosize,
   15663                 :            :                                               PCI_VPD_RO_KEYWORD_VENDOR0);
   15664         [ #  # ]:          0 :                 if (j < 0)
   15665                 :          0 :                         goto partno;
   15666                 :            : 
   15667         [ #  # ]:          0 :                 len = pci_vpd_info_field_size(&vpd_data[j]);
   15668                 :            : 
   15669                 :          0 :                 j += PCI_VPD_INFO_FLD_HDR_SIZE;
   15670         [ #  # ]:          0 :                 if (j + len > block_end)
   15671                 :          0 :                         goto partno;
   15672                 :            : 
   15673                 :          0 :                 if (len >= sizeof(tp->fw_ver))
   15674                 :            :                         len = sizeof(tp->fw_ver) - 1;
   15675                 :          0 :                 memset(tp->fw_ver, 0, sizeof(tp->fw_ver));
   15676                 :          0 :                 snprintf(tp->fw_ver, sizeof(tp->fw_ver), "%.*s bc ", len,
   15677                 :            :                          &vpd_data[j]);
   15678                 :            :         }
   15679                 :            : 
   15680                 :          0 : partno:
   15681                 :          0 :         i = pci_vpd_find_info_keyword(vpd_data, i, rosize,
   15682                 :            :                                       PCI_VPD_RO_KEYWORD_PARTNO);
   15683         [ #  # ]:          0 :         if (i < 0)
   15684                 :          0 :                 goto out_not_found;
   15685                 :            : 
   15686         [ #  # ]:          0 :         len = pci_vpd_info_field_size(&vpd_data[i]);
   15687                 :            : 
   15688                 :          0 :         i += PCI_VPD_INFO_FLD_HDR_SIZE;
   15689         [ #  # ]:          0 :         if (len > TG3_BPN_SIZE ||
   15690         [ #  # ]:          0 :             (len + i) > vpdlen)
   15691                 :          0 :                 goto out_not_found;
   15692                 :            : 
   15693                 :          0 :         memcpy(tp->board_part_number, &vpd_data[i], len);
   15694                 :            : 
   15695                 :          0 : out_not_found:
   15696                 :          0 :         kfree(vpd_data);
   15697         [ #  # ]:          0 :         if (tp->board_part_number[0])
   15698                 :          0 :                 return;
   15699                 :            : 
   15700                 :          0 : out_no_vpd:
   15701         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717) {
   15702         [ #  # ]:          0 :                 if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 ||
   15703                 :            :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C)
   15704                 :          0 :                         strcpy(tp->board_part_number, "BCM5717");
   15705         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718)
   15706                 :          0 :                         strcpy(tp->board_part_number, "BCM5718");
   15707                 :            :                 else
   15708                 :          0 :                         goto nomatch;
   15709         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_57780) {
   15710         [ #  # ]:          0 :                 if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57780)
   15711                 :          0 :                         strcpy(tp->board_part_number, "BCM57780");
   15712         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57760)
   15713                 :          0 :                         strcpy(tp->board_part_number, "BCM57760");
   15714         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57790)
   15715                 :          0 :                         strcpy(tp->board_part_number, "BCM57790");
   15716         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57788)
   15717                 :          0 :                         strcpy(tp->board_part_number, "BCM57788");
   15718                 :            :                 else
   15719                 :          0 :                         goto nomatch;
   15720         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_57765) {
   15721         [ #  # ]:          0 :                 if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57761)
   15722                 :          0 :                         strcpy(tp->board_part_number, "BCM57761");
   15723         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57765)
   15724                 :          0 :                         strcpy(tp->board_part_number, "BCM57765");
   15725         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57781)
   15726                 :          0 :                         strcpy(tp->board_part_number, "BCM57781");
   15727         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57785)
   15728                 :          0 :                         strcpy(tp->board_part_number, "BCM57785");
   15729         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57791)
   15730                 :          0 :                         strcpy(tp->board_part_number, "BCM57791");
   15731         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57795)
   15732                 :          0 :                         strcpy(tp->board_part_number, "BCM57795");
   15733                 :            :                 else
   15734                 :          0 :                         goto nomatch;
   15735         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_57766) {
   15736         [ #  # ]:          0 :                 if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57762)
   15737                 :          0 :                         strcpy(tp->board_part_number, "BCM57762");
   15738         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57766)
   15739                 :          0 :                         strcpy(tp->board_part_number, "BCM57766");
   15740         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57782)
   15741                 :          0 :                         strcpy(tp->board_part_number, "BCM57782");
   15742         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57786)
   15743                 :          0 :                         strcpy(tp->board_part_number, "BCM57786");
   15744                 :            :                 else
   15745                 :          0 :                         goto nomatch;
   15746         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_5906) {
   15747                 :          0 :                 strcpy(tp->board_part_number, "BCM95906");
   15748                 :            :         } else {
   15749                 :          0 : nomatch:
   15750                 :          0 :                 strcpy(tp->board_part_number, "none");
   15751                 :            :         }
   15752                 :            : }
   15753                 :            : 
   15754                 :          0 : static int tg3_fw_img_is_valid(struct tg3 *tp, u32 offset)
   15755                 :            : {
   15756                 :          0 :         u32 val;
   15757                 :            : 
   15758         [ #  # ]:          0 :         if (tg3_nvram_read(tp, offset, &val) ||
   15759   [ #  #  #  # ]:          0 :             (val & 0xfc000000) != 0x0c000000 ||
   15760                 :          0 :             tg3_nvram_read(tp, offset + 4, &val) ||
   15761         [ #  # ]:          0 :             val != 0)
   15762                 :          0 :                 return 0;
   15763                 :            : 
   15764                 :            :         return 1;
   15765                 :            : }
   15766                 :            : 
   15767                 :          0 : static void tg3_read_bc_ver(struct tg3 *tp)
   15768                 :            : {
   15769                 :          0 :         u32 val, offset, start, ver_offset;
   15770                 :          0 :         int i, dst_off;
   15771                 :          0 :         bool newver = false;
   15772                 :            : 
   15773   [ #  #  #  # ]:          0 :         if (tg3_nvram_read(tp, 0xc, &offset) ||
   15774                 :          0 :             tg3_nvram_read(tp, 0x4, &start))
   15775                 :          0 :                 return;
   15776                 :            : 
   15777                 :          0 :         offset = tg3_nvram_logical_addr(tp, offset);
   15778                 :            : 
   15779         [ #  # ]:          0 :         if (tg3_nvram_read(tp, offset, &val))
   15780                 :            :                 return;
   15781                 :            : 
   15782         [ #  # ]:          0 :         if ((val & 0xfc000000) == 0x0c000000) {
   15783         [ #  # ]:          0 :                 if (tg3_nvram_read(tp, offset + 4, &val))
   15784                 :            :                         return;
   15785                 :            : 
   15786         [ #  # ]:          0 :                 if (val == 0)
   15787                 :          0 :                         newver = true;
   15788                 :            :         }
   15789                 :            : 
   15790                 :          0 :         dst_off = strlen(tp->fw_ver);
   15791                 :            : 
   15792         [ #  # ]:          0 :         if (newver) {
   15793   [ #  #  #  # ]:          0 :                 if (TG3_VER_SIZE - dst_off < 16 ||
   15794                 :          0 :                     tg3_nvram_read(tp, offset + 8, &ver_offset))
   15795                 :          0 :                         return;
   15796                 :            : 
   15797                 :          0 :                 offset = offset + ver_offset - start;
   15798         [ #  # ]:          0 :                 for (i = 0; i < 16; i += 4) {
   15799                 :          0 :                         __be32 v;
   15800         [ #  # ]:          0 :                         if (tg3_nvram_read_be32(tp, offset + i, &v))
   15801                 :            :                                 return;
   15802                 :            : 
   15803                 :          0 :                         memcpy(tp->fw_ver + dst_off + i, &v, sizeof(v));
   15804                 :            :                 }
   15805                 :            :         } else {
   15806                 :          0 :                 u32 major, minor;
   15807                 :            : 
   15808         [ #  # ]:          0 :                 if (tg3_nvram_read(tp, TG3_NVM_PTREV_BCVER, &ver_offset))
   15809                 :            :                         return;
   15810                 :            : 
   15811                 :          0 :                 major = (ver_offset & TG3_NVM_BCVER_MAJMSK) >>
   15812                 :            :                         TG3_NVM_BCVER_MAJSFT;
   15813                 :          0 :                 minor = ver_offset & TG3_NVM_BCVER_MINMSK;
   15814                 :          0 :                 snprintf(&tp->fw_ver[dst_off], TG3_VER_SIZE - dst_off,
   15815                 :            :                          "v%d.%02d", major, minor);
   15816                 :            :         }
   15817                 :            : }
   15818                 :            : 
   15819                 :          0 : static void tg3_read_hwsb_ver(struct tg3 *tp)
   15820                 :            : {
   15821                 :          0 :         u32 val, major, minor;
   15822                 :            : 
   15823                 :            :         /* Use native endian representation */
   15824         [ #  # ]:          0 :         if (tg3_nvram_read(tp, TG3_NVM_HWSB_CFG1, &val))
   15825                 :          0 :                 return;
   15826                 :            : 
   15827                 :          0 :         major = (val & TG3_NVM_HWSB_CFG1_MAJMSK) >>
   15828                 :            :                 TG3_NVM_HWSB_CFG1_MAJSFT;
   15829                 :          0 :         minor = (val & TG3_NVM_HWSB_CFG1_MINMSK) >>
   15830                 :            :                 TG3_NVM_HWSB_CFG1_MINSFT;
   15831                 :            : 
   15832                 :          0 :         snprintf(&tp->fw_ver[0], 32, "sb v%d.%02d", major, minor);
   15833                 :            : }
   15834                 :            : 
   15835                 :          0 : static void tg3_read_sb_ver(struct tg3 *tp, u32 val)
   15836                 :            : {
   15837                 :          0 :         u32 offset, major, minor, build;
   15838                 :            : 
   15839                 :          0 :         strncat(tp->fw_ver, "sb", TG3_VER_SIZE - strlen(tp->fw_ver) - 1);
   15840                 :            : 
   15841         [ #  # ]:          0 :         if ((val & TG3_EEPROM_SB_FORMAT_MASK) != TG3_EEPROM_SB_FORMAT_1)
   15842                 :            :                 return;
   15843                 :            : 
   15844   [ #  #  #  #  :          0 :         switch (val & TG3_EEPROM_SB_REVISION_MASK) {
                #  #  # ]
   15845                 :            :         case TG3_EEPROM_SB_REVISION_0:
   15846                 :            :                 offset = TG3_EEPROM_SB_F1R0_EDH_OFF;
   15847                 :            :                 break;
   15848                 :          0 :         case TG3_EEPROM_SB_REVISION_2:
   15849                 :          0 :                 offset = TG3_EEPROM_SB_F1R2_EDH_OFF;
   15850                 :          0 :                 break;
   15851                 :          0 :         case TG3_EEPROM_SB_REVISION_3:
   15852                 :          0 :                 offset = TG3_EEPROM_SB_F1R3_EDH_OFF;
   15853                 :          0 :                 break;
   15854                 :          0 :         case TG3_EEPROM_SB_REVISION_4:
   15855                 :          0 :                 offset = TG3_EEPROM_SB_F1R4_EDH_OFF;
   15856                 :          0 :                 break;
   15857                 :          0 :         case TG3_EEPROM_SB_REVISION_5:
   15858                 :          0 :                 offset = TG3_EEPROM_SB_F1R5_EDH_OFF;
   15859                 :          0 :                 break;
   15860                 :          0 :         case TG3_EEPROM_SB_REVISION_6:
   15861                 :          0 :                 offset = TG3_EEPROM_SB_F1R6_EDH_OFF;
   15862                 :          0 :                 break;
   15863                 :            :         default:
   15864                 :            :                 return;
   15865                 :            :         }
   15866                 :            : 
   15867         [ #  # ]:          0 :         if (tg3_nvram_read(tp, offset, &val))
   15868                 :            :                 return;
   15869                 :            : 
   15870                 :          0 :         build = (val & TG3_EEPROM_SB_EDH_BLD_MASK) >>
   15871                 :            :                 TG3_EEPROM_SB_EDH_BLD_SHFT;
   15872                 :          0 :         major = (val & TG3_EEPROM_SB_EDH_MAJ_MASK) >>
   15873                 :            :                 TG3_EEPROM_SB_EDH_MAJ_SHFT;
   15874                 :          0 :         minor =  val & TG3_EEPROM_SB_EDH_MIN_MASK;
   15875                 :            : 
   15876         [ #  # ]:          0 :         if (minor > 99 || build > 26)
   15877                 :            :                 return;
   15878                 :            : 
   15879                 :          0 :         offset = strlen(tp->fw_ver);
   15880                 :          0 :         snprintf(&tp->fw_ver[offset], TG3_VER_SIZE - offset,
   15881                 :            :                  " v%d.%02d", major, minor);
   15882                 :            : 
   15883         [ #  # ]:          0 :         if (build > 0) {
   15884                 :          0 :                 offset = strlen(tp->fw_ver);
   15885         [ #  # ]:          0 :                 if (offset < TG3_VER_SIZE - 1)
   15886                 :          0 :                         tp->fw_ver[offset] = 'a' + build - 1;
   15887                 :            :         }
   15888                 :            : }
   15889                 :            : 
   15890                 :          0 : static void tg3_read_mgmtfw_ver(struct tg3 *tp)
   15891                 :            : {
   15892                 :          0 :         u32 val, offset, start;
   15893                 :          0 :         int i, vlen;
   15894                 :            : 
   15895                 :          0 :         for (offset = TG3_NVM_DIR_START;
   15896         [ #  # ]:          0 :              offset < TG3_NVM_DIR_END;
   15897                 :          0 :              offset += TG3_NVM_DIRENT_SIZE) {
   15898         [ #  # ]:          0 :                 if (tg3_nvram_read(tp, offset, &val))
   15899                 :          0 :                         return;
   15900                 :            : 
   15901         [ #  # ]:          0 :                 if ((val >> TG3_NVM_DIRTYPE_SHIFT) == TG3_NVM_DIRTYPE_ASFINI)
   15902                 :            :                         break;
   15903                 :            :         }
   15904                 :            : 
   15905         [ #  # ]:          0 :         if (offset == TG3_NVM_DIR_END)
   15906                 :            :                 return;
   15907                 :            : 
   15908         [ #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS))
   15909                 :          0 :                 start = 0x08000000;
   15910         [ #  # ]:          0 :         else if (tg3_nvram_read(tp, offset - 4, &start))
   15911                 :            :                 return;
   15912                 :            : 
   15913   [ #  #  #  # ]:          0 :         if (tg3_nvram_read(tp, offset + 4, &offset) ||
   15914         [ #  # ]:          0 :             !tg3_fw_img_is_valid(tp, offset) ||
   15915                 :          0 :             tg3_nvram_read(tp, offset + 8, &val))
   15916                 :          0 :                 return;
   15917                 :            : 
   15918                 :          0 :         offset += val - start;
   15919                 :            : 
   15920                 :          0 :         vlen = strlen(tp->fw_ver);
   15921                 :            : 
   15922                 :          0 :         tp->fw_ver[vlen++] = ',';
   15923                 :          0 :         tp->fw_ver[vlen++] = ' ';
   15924                 :            : 
   15925         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
   15926                 :          0 :                 __be32 v;
   15927         [ #  # ]:          0 :                 if (tg3_nvram_read_be32(tp, offset, &v))
   15928                 :          0 :                         return;
   15929                 :            : 
   15930                 :          0 :                 offset += sizeof(v);
   15931                 :            : 
   15932         [ #  # ]:          0 :                 if (vlen > TG3_VER_SIZE - sizeof(v)) {
   15933                 :          0 :                         memcpy(&tp->fw_ver[vlen], &v, TG3_VER_SIZE - vlen);
   15934                 :          0 :                         break;
   15935                 :            :                 }
   15936                 :            : 
   15937                 :          0 :                 memcpy(&tp->fw_ver[vlen], &v, sizeof(v));
   15938                 :          0 :                 vlen += sizeof(v);
   15939                 :            :         }
   15940                 :            : }
   15941                 :            : 
   15942                 :          0 : static void tg3_probe_ncsi(struct tg3 *tp)
   15943                 :            : {
   15944                 :          0 :         u32 apedata;
   15945                 :            : 
   15946                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG);
   15947         [ #  # ]:          0 :         if (apedata != APE_SEG_SIG_MAGIC)
   15948                 :            :                 return;
   15949                 :            : 
   15950                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS);
   15951         [ #  # ]:          0 :         if (!(apedata & APE_FW_STATUS_READY))
   15952                 :            :                 return;
   15953                 :            : 
   15954         [ #  # ]:          0 :         if (tg3_ape_read32(tp, TG3_APE_FW_FEATURES) & TG3_APE_FW_FEATURE_NCSI)
   15955                 :          0 :                 tg3_flag_set(tp, APE_HAS_NCSI);
   15956                 :            : }
   15957                 :            : 
   15958                 :          0 : static void tg3_read_dash_ver(struct tg3 *tp)
   15959                 :            : {
   15960                 :          0 :         int vlen;
   15961                 :          0 :         u32 apedata;
   15962                 :          0 :         char *fwtype;
   15963                 :            : 
   15964                 :          0 :         apedata = tg3_ape_read32(tp, TG3_APE_FW_VERSION);
   15965                 :            : 
   15966         [ #  # ]:          0 :         if (tg3_flag(tp, APE_HAS_NCSI))
   15967                 :            :                 fwtype = "NCSI";
   15968         [ #  # ]:          0 :         else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5725)
   15969                 :            :                 fwtype = "SMASH";
   15970                 :            :         else
   15971                 :          0 :                 fwtype = "DASH";
   15972                 :            : 
   15973                 :          0 :         vlen = strlen(tp->fw_ver);
   15974                 :            : 
   15975                 :          0 :         snprintf(&tp->fw_ver[vlen], TG3_VER_SIZE - vlen, " %s v%d.%d.%d.%d",
   15976                 :            :                  fwtype,
   15977                 :            :                  (apedata & APE_FW_VERSION_MAJMSK) >> APE_FW_VERSION_MAJSFT,
   15978                 :          0 :                  (apedata & APE_FW_VERSION_MINMSK) >> APE_FW_VERSION_MINSFT,
   15979                 :          0 :                  (apedata & APE_FW_VERSION_REVMSK) >> APE_FW_VERSION_REVSFT,
   15980                 :            :                  (apedata & APE_FW_VERSION_BLDMSK));
   15981                 :          0 : }
   15982                 :            : 
   15983                 :          0 : static void tg3_read_otp_ver(struct tg3 *tp)
   15984                 :            : {
   15985                 :          0 :         u32 val, val2;
   15986                 :            : 
   15987         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5762)
   15988                 :          0 :                 return;
   15989                 :            : 
   15990   [ #  #  #  # ]:          0 :         if (!tg3_ape_otp_read(tp, OTP_ADDRESS_MAGIC0, &val) &&
   15991                 :          0 :             !tg3_ape_otp_read(tp, OTP_ADDRESS_MAGIC0 + 4, &val2) &&
   15992   [ #  #  #  # ]:          0 :             TG3_OTP_MAGIC0_VALID(val)) {
   15993                 :          0 :                 u64 val64 = (u64) val << 32 | val2;
   15994                 :          0 :                 u32 ver = 0;
   15995                 :          0 :                 int i, vlen;
   15996                 :            : 
   15997         [ #  # ]:          0 :                 for (i = 0; i < 7; i++) {
   15998         [ #  # ]:          0 :                         if ((val64 & 0xff) == 0)
   15999                 :            :                                 break;
   16000                 :          0 :                         ver = val64 & 0xff;
   16001                 :          0 :                         val64 >>= 8;
   16002                 :            :                 }
   16003                 :          0 :                 vlen = strlen(tp->fw_ver);
   16004                 :          0 :                 snprintf(&tp->fw_ver[vlen], TG3_VER_SIZE - vlen, " .%02d", ver);
   16005                 :            :         }
   16006                 :            : }
   16007                 :            : 
   16008                 :          0 : static void tg3_read_fw_ver(struct tg3 *tp)
   16009                 :            : {
   16010                 :          0 :         u32 val;
   16011                 :          0 :         bool vpd_vers = false;
   16012                 :            : 
   16013         [ #  # ]:          0 :         if (tp->fw_ver[0] != 0)
   16014                 :          0 :                 vpd_vers = true;
   16015                 :            : 
   16016         [ #  # ]:          0 :         if (tg3_flag(tp, NO_NVRAM)) {
   16017                 :          0 :                 strcat(tp->fw_ver, "sb");
   16018                 :          0 :                 tg3_read_otp_ver(tp);
   16019                 :          0 :                 return;
   16020                 :            :         }
   16021                 :            : 
   16022         [ #  # ]:          0 :         if (tg3_nvram_read(tp, 0, &val))
   16023                 :            :                 return;
   16024                 :            : 
   16025         [ #  # ]:          0 :         if (val == TG3_EEPROM_MAGIC)
   16026                 :          0 :                 tg3_read_bc_ver(tp);
   16027         [ #  # ]:          0 :         else if ((val & TG3_EEPROM_MAGIC_FW_MSK) == TG3_EEPROM_MAGIC_FW)
   16028                 :          0 :                 tg3_read_sb_ver(tp, val);
   16029         [ #  # ]:          0 :         else if ((val & TG3_EEPROM_MAGIC_HW_MSK) == TG3_EEPROM_MAGIC_HW)
   16030                 :          0 :                 tg3_read_hwsb_ver(tp);
   16031                 :            : 
   16032         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_ASF)) {
   16033         [ #  # ]:          0 :                 if (tg3_flag(tp, ENABLE_APE)) {
   16034                 :          0 :                         tg3_probe_ncsi(tp);
   16035         [ #  # ]:          0 :                         if (!vpd_vers)
   16036                 :          0 :                                 tg3_read_dash_ver(tp);
   16037         [ #  # ]:          0 :                 } else if (!vpd_vers) {
   16038                 :          0 :                         tg3_read_mgmtfw_ver(tp);
   16039                 :            :                 }
   16040                 :            :         }
   16041                 :            : 
   16042                 :          0 :         tp->fw_ver[TG3_VER_SIZE - 1] = 0;
   16043                 :            : }
   16044                 :            : 
   16045                 :          0 : static inline u32 tg3_rx_ret_ring_size(struct tg3 *tp)
   16046                 :            : {
   16047         [ #  # ]:          0 :         if (tg3_flag(tp, LRG_PROD_RING_CAP))
   16048                 :            :                 return TG3_RX_RET_MAX_SIZE_5717;
   16049   [ #  #  #  # ]:          0 :         else if (tg3_flag(tp, JUMBO_CAPABLE) && !tg3_flag(tp, 5780_CLASS))
   16050                 :            :                 return TG3_RX_RET_MAX_SIZE_5700;
   16051                 :            :         else
   16052                 :          0 :                 return TG3_RX_RET_MAX_SIZE_5705;
   16053                 :            : }
   16054                 :            : 
   16055                 :            : static const struct pci_device_id tg3_write_reorder_chipsets[] = {
   16056                 :            :         { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C) },
   16057                 :            :         { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE) },
   16058                 :            :         { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8385_0) },
   16059                 :            :         { },
   16060                 :            : };
   16061                 :            : 
   16062                 :            : static struct pci_dev *tg3_find_peer(struct tg3 *tp)
   16063                 :            : {
   16064                 :            :         struct pci_dev *peer;
   16065                 :            :         unsigned int func, devnr = tp->pdev->devfn & ~7;
   16066                 :            : 
   16067                 :            :         for (func = 0; func < 8; func++) {
   16068                 :            :                 peer = pci_get_slot(tp->pdev->bus, devnr | func);
   16069                 :            :                 if (peer && peer != tp->pdev)
   16070                 :            :                         break;
   16071                 :            :                 pci_dev_put(peer);
   16072                 :            :         }
   16073                 :            :         /* 5704 can be configured in single-port mode, set peer to
   16074                 :            :          * tp->pdev in that case.
   16075                 :            :          */
   16076                 :            :         if (!peer) {
   16077                 :            :                 peer = tp->pdev;
   16078                 :            :                 return peer;
   16079                 :            :         }
   16080                 :            : 
   16081                 :            :         /*
   16082                 :            :          * We don't need to keep the refcount elevated; there's no way
   16083                 :            :          * to remove one half of this device without removing the other
   16084                 :            :          */
   16085                 :            :         pci_dev_put(peer);
   16086                 :            : 
   16087                 :            :         return peer;
   16088                 :            : }
   16089                 :            : 
   16090                 :          0 : static void tg3_detect_asic_rev(struct tg3 *tp, u32 misc_ctrl_reg)
   16091                 :            : {
   16092                 :          0 :         tp->pci_chip_rev_id = misc_ctrl_reg >> MISC_HOST_CTRL_CHIPREV_SHIFT;
   16093         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_USE_PROD_ID_REG) {
   16094                 :          0 :                 u32 reg;
   16095                 :            : 
   16096                 :            :                 /* All devices that use the alternate
   16097                 :            :                  * ASIC REV location have a CPMU.
   16098                 :            :                  */
   16099                 :          0 :                 tg3_flag_set(tp, CPMU_PRESENT);
   16100                 :            : 
   16101         [ #  # ]:          0 :                 if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 ||
   16102         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C ||
   16103         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||
   16104         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||
   16105         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720 ||
   16106         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_57767 ||
   16107         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_57764 ||
   16108         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5762 ||
   16109         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5725 ||
   16110         [ #  # ]:          0 :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_5727 ||
   16111                 :            :                     tp->pdev->device == TG3PCI_DEVICE_TIGON3_57787)
   16112                 :            :                         reg = TG3PCI_GEN2_PRODID_ASICREV;
   16113         [ #  # ]:          0 :                 else if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_57781 ||
   16114         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57785 ||
   16115         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57761 ||
   16116         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57765 ||
   16117         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57791 ||
   16118         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57795 ||
   16119         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57762 ||
   16120         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57766 ||
   16121         [ #  # ]:          0 :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57782 ||
   16122                 :            :                          tp->pdev->device == TG3PCI_DEVICE_TIGON3_57786)
   16123                 :            :                         reg = TG3PCI_GEN15_PRODID_ASICREV;
   16124                 :            :                 else
   16125                 :          0 :                         reg = TG3PCI_PRODID_ASICREV;
   16126                 :            : 
   16127                 :          0 :                 pci_read_config_dword(tp->pdev, reg, &tp->pci_chip_rev_id);
   16128                 :            :         }
   16129                 :            : 
   16130                 :            :         /* Wrong chip ID in 5752 A0. This code can be removed later
   16131                 :            :          * as A0 is not in production.
   16132                 :            :          */
   16133         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5752_A0_HW)
   16134                 :          0 :                 tp->pci_chip_rev_id = CHIPREV_ID_5752_A0;
   16135                 :            : 
   16136         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5717_C0)
   16137                 :          0 :                 tp->pci_chip_rev_id = CHIPREV_ID_5720_A0;
   16138                 :            : 
   16139         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   16140         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5719 ||
   16141                 :            :             tg3_asic_rev(tp) == ASIC_REV_5720)
   16142                 :          0 :                 tg3_flag_set(tp, 5717_PLUS);
   16143                 :            : 
   16144         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57765 ||
   16145                 :            :             tg3_asic_rev(tp) == ASIC_REV_57766)
   16146                 :          0 :                 tg3_flag_set(tp, 57765_CLASS);
   16147                 :            : 
   16148   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, 57765_CLASS) || tg3_flag(tp, 5717_PLUS) ||
   16149         [ #  # ]:          0 :              tg3_asic_rev(tp) == ASIC_REV_5762)
   16150                 :          0 :                 tg3_flag_set(tp, 57765_PLUS);
   16151                 :            : 
   16152                 :            :         /* Intentionally exclude ASIC_REV_5906 */
   16153                 :          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5755 ||
   16154         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5787 ||
   16155         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5784 ||
   16156         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5761 ||
   16157         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5785 ||
   16158         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_57780 ||
   16159                 :            :             tg3_flag(tp, 57765_PLUS))
   16160                 :          0 :                 tg3_flag_set(tp, 5755_PLUS);
   16161                 :            : 
   16162         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5780 ||
   16163                 :            :             tg3_asic_rev(tp) == ASIC_REV_5714)
   16164                 :          0 :                 tg3_flag_set(tp, 5780_CLASS);
   16165                 :            : 
   16166         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5750 ||
   16167         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5752 ||
   16168         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5906 ||
   16169         [ #  # ]:          0 :             tg3_flag(tp, 5755_PLUS) ||
   16170                 :            :             tg3_flag(tp, 5780_CLASS))
   16171                 :          0 :                 tg3_flag_set(tp, 5750_PLUS);
   16172                 :            : 
   16173   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5705 ||
   16174                 :            :             tg3_flag(tp, 5750_PLUS))
   16175                 :          0 :                 tg3_flag_set(tp, 5705_PLUS);
   16176                 :          0 : }
   16177                 :            : 
   16178                 :            : static bool tg3_10_100_only_device(struct tg3 *tp,
   16179                 :            :                                    const struct pci_device_id *ent)
   16180                 :            : {
   16181                 :            :         u32 grc_misc_cfg = tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK;
   16182                 :            : 
   16183                 :            :         if ((tg3_asic_rev(tp) == ASIC_REV_5703 &&
   16184                 :            :              (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) ||
   16185                 :            :             (tp->phy_flags & TG3_PHYFLG_IS_FET))
   16186                 :            :                 return true;
   16187                 :            : 
   16188                 :            :         if (ent->driver_data & TG3_DRV_DATA_FLAG_10_100_ONLY) {
   16189                 :            :                 if (tg3_asic_rev(tp) == ASIC_REV_5705) {
   16190                 :            :                         if (ent->driver_data & TG3_DRV_DATA_FLAG_5705_10_100)
   16191                 :            :                                 return true;
   16192                 :            :                 } else {
   16193                 :            :                         return true;
   16194                 :            :                 }
   16195                 :            :         }
   16196                 :            : 
   16197                 :            :         return false;
   16198                 :            : }
   16199                 :            : 
   16200                 :          0 : static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
   16201                 :            : {
   16202                 :          0 :         u32 misc_ctrl_reg;
   16203                 :          0 :         u32 pci_state_reg, grc_misc_cfg;
   16204                 :          0 :         u32 val;
   16205                 :          0 :         u16 pci_cmd;
   16206                 :          0 :         int err;
   16207                 :            : 
   16208                 :            :         /* Force memory write invalidate off.  If we leave it on,
   16209                 :            :          * then on 5700_BX chips we have to enable a workaround.
   16210                 :            :          * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
   16211                 :            :          * to match the cacheline size.  The Broadcom driver have this
   16212                 :            :          * workaround but turns MWI off all the times so never uses
   16213                 :            :          * it.  This seems to suggest that the workaround is insufficient.
   16214                 :            :          */
   16215                 :          0 :         pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
   16216                 :          0 :         pci_cmd &= ~PCI_COMMAND_INVALIDATE;
   16217                 :          0 :         pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
   16218                 :            : 
   16219                 :            :         /* Important! -- Make sure register accesses are byteswapped
   16220                 :            :          * correctly.  Also, for those chips that require it, make
   16221                 :            :          * sure that indirect register accesses are enabled before
   16222                 :            :          * the first operation.
   16223                 :            :          */
   16224                 :          0 :         pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
   16225                 :            :                               &misc_ctrl_reg);
   16226                 :          0 :         tp->misc_host_ctrl |= (misc_ctrl_reg &
   16227                 :            :                                MISC_HOST_CTRL_CHIPREV);
   16228                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
   16229                 :            :                                tp->misc_host_ctrl);
   16230                 :            : 
   16231                 :          0 :         tg3_detect_asic_rev(tp, misc_ctrl_reg);
   16232                 :            : 
   16233                 :            :         /* If we have 5702/03 A1 or A2 on certain ICH chipsets,
   16234                 :            :          * we need to disable memory and use config. cycles
   16235                 :            :          * only to access all registers. The 5702/03 chips
   16236                 :            :          * can mistakenly decode the special cycles from the
   16237                 :            :          * ICH chipsets as memory write cycles, causing corruption
   16238                 :            :          * of register and memory space. Only certain ICH bridges
   16239                 :            :          * will drive special cycles with non-zero data during the
   16240                 :            :          * address phase which can fall within the 5703's address
   16241                 :            :          * range. This is not an ICH bug as the PCI spec allows
   16242                 :            :          * non-zero address during special cycles. However, only
   16243                 :            :          * these ICH bridges are known to drive non-zero addresses
   16244                 :            :          * during special cycles.
   16245                 :            :          *
   16246                 :            :          * Since special cycles do not cross PCI bridges, we only
   16247                 :            :          * enable this workaround if the 5703 is on the secondary
   16248                 :            :          * bus of these ICH bridges.
   16249                 :            :          */
   16250         [ #  # ]:          0 :         if ((tg3_chip_rev_id(tp) == CHIPREV_ID_5703_A1) ||
   16251                 :            :             (tg3_chip_rev_id(tp) == CHIPREV_ID_5703_A2)) {
   16252                 :            :                 static struct tg3_dev_id {
   16253                 :            :                         u32     vendor;
   16254                 :            :                         u32     device;
   16255                 :            :                         u32     rev;
   16256                 :            :                 } ich_chipsets[] = {
   16257                 :            :                         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_8,
   16258                 :            :                           PCI_ANY_ID },
   16259                 :            :                         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_8,
   16260                 :            :                           PCI_ANY_ID },
   16261                 :            :                         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_11,
   16262                 :            :                           0xa },
   16263                 :            :                         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_6,
   16264                 :            :                           PCI_ANY_ID },
   16265                 :            :                         { },
   16266                 :            :                 };
   16267                 :            :                 struct tg3_dev_id *pci_id = &ich_chipsets[0];
   16268                 :            :                 struct pci_dev *bridge = NULL;
   16269                 :            : 
   16270         [ #  # ]:          0 :                 while (pci_id->vendor != 0) {
   16271                 :          0 :                         bridge = pci_get_device(pci_id->vendor, pci_id->device,
   16272                 :            :                                                 bridge);
   16273         [ #  # ]:          0 :                         if (!bridge) {
   16274                 :          0 :                                 pci_id++;
   16275                 :          0 :                                 continue;
   16276                 :            :                         }
   16277         [ #  # ]:          0 :                         if (pci_id->rev != PCI_ANY_ID) {
   16278         [ #  # ]:          0 :                                 if (bridge->revision > pci_id->rev)
   16279                 :          0 :                                         continue;
   16280                 :            :                         }
   16281         [ #  # ]:          0 :                         if (bridge->subordinate &&
   16282                 :          0 :                             (bridge->subordinate->number ==
   16283         [ #  # ]:          0 :                              tp->pdev->bus->number)) {
   16284                 :          0 :                                 tg3_flag_set(tp, ICH_WORKAROUND);
   16285                 :          0 :                                 pci_dev_put(bridge);
   16286                 :          0 :                                 break;
   16287                 :            :                         }
   16288                 :            :                 }
   16289                 :            :         }
   16290                 :            : 
   16291         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5701) {
   16292                 :            :                 static struct tg3_dev_id {
   16293                 :            :                         u32     vendor;
   16294                 :            :                         u32     device;
   16295                 :            :                 } bridge_chipsets[] = {
   16296                 :            :                         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0 },
   16297                 :            :                         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1 },
   16298                 :            :                         { },
   16299                 :            :                 };
   16300                 :            :                 struct tg3_dev_id *pci_id = &bridge_chipsets[0];
   16301                 :            :                 struct pci_dev *bridge = NULL;
   16302                 :            : 
   16303         [ #  # ]:          0 :                 while (pci_id->vendor != 0) {
   16304                 :          0 :                         bridge = pci_get_device(pci_id->vendor,
   16305                 :            :                                                 pci_id->device,
   16306                 :            :                                                 bridge);
   16307         [ #  # ]:          0 :                         if (!bridge) {
   16308                 :          0 :                                 pci_id++;
   16309                 :          0 :                                 continue;
   16310                 :            :                         }
   16311         [ #  # ]:          0 :                         if (bridge->subordinate &&
   16312                 :          0 :                             (bridge->subordinate->number <=
   16313         [ #  # ]:          0 :                              tp->pdev->bus->number) &&
   16314                 :          0 :                             (bridge->subordinate->busn_res.end >=
   16315         [ #  # ]:          0 :                              tp->pdev->bus->number)) {
   16316                 :          0 :                                 tg3_flag_set(tp, 5701_DMA_BUG);
   16317                 :          0 :                                 pci_dev_put(bridge);
   16318                 :          0 :                                 break;
   16319                 :            :                         }
   16320                 :            :                 }
   16321                 :            :         }
   16322                 :            : 
   16323                 :            :         /* The EPB bridge inside 5714, 5715, and 5780 cannot support
   16324                 :            :          * DMA addresses > 40-bit. This bridge may have other additional
   16325                 :            :          * 57xx devices behind it in some 4-port NIC designs for example.
   16326                 :            :          * Any tg3 device found behind the bridge will also need the 40-bit
   16327                 :            :          * DMA workaround.
   16328                 :            :          */
   16329         [ #  # ]:          0 :         if (tg3_flag(tp, 5780_CLASS)) {
   16330                 :          0 :                 tg3_flag_set(tp, 40BIT_DMA_BUG);
   16331                 :          0 :                 tp->msi_cap = tp->pdev->msi_cap;
   16332                 :            :         } else {
   16333                 :            :                 struct pci_dev *bridge = NULL;
   16334                 :            : 
   16335                 :          0 :                 do {
   16336                 :          0 :                         bridge = pci_get_device(PCI_VENDOR_ID_SERVERWORKS,
   16337                 :            :                                                 PCI_DEVICE_ID_SERVERWORKS_EPB,
   16338                 :            :                                                 bridge);
   16339   [ #  #  #  # ]:          0 :                         if (bridge && bridge->subordinate &&
   16340                 :          0 :                             (bridge->subordinate->number <=
   16341         [ #  # ]:          0 :                              tp->pdev->bus->number) &&
   16342                 :          0 :                             (bridge->subordinate->busn_res.end >=
   16343         [ #  # ]:          0 :                              tp->pdev->bus->number)) {
   16344                 :          0 :                                 tg3_flag_set(tp, 40BIT_DMA_BUG);
   16345                 :          0 :                                 pci_dev_put(bridge);
   16346                 :          0 :                                 break;
   16347                 :            :                         }
   16348         [ #  # ]:          0 :                 } while (bridge);
   16349                 :            :         }
   16350                 :            : 
   16351         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5704 ||
   16352                 :            :             tg3_asic_rev(tp) == ASIC_REV_5714)
   16353                 :          0 :                 tp->pdev_peer = tg3_find_peer(tp);
   16354                 :            : 
   16355                 :            :         /* Determine TSO capabilities */
   16356         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0)
   16357                 :            :                 ; /* Do nothing. HW bug. */
   16358         [ #  # ]:          0 :         else if (tg3_flag(tp, 57765_PLUS))
   16359                 :          0 :                 tg3_flag_set(tp, HW_TSO_3);
   16360         [ #  # ]:          0 :         else if (tg3_flag(tp, 5755_PLUS) ||
   16361         [ #  # ]:          0 :                  tg3_asic_rev(tp) == ASIC_REV_5906)
   16362                 :          0 :                 tg3_flag_set(tp, HW_TSO_2);
   16363         [ #  # ]:          0 :         else if (tg3_flag(tp, 5750_PLUS)) {
   16364                 :          0 :                 tg3_flag_set(tp, HW_TSO_1);
   16365                 :          0 :                 tg3_flag_set(tp, TSO_BUG);
   16366   [ #  #  #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5750 &&
   16367                 :            :                     tg3_chip_rev_id(tp) >= CHIPREV_ID_5750_C2)
   16368                 :          0 :                         tg3_flag_clear(tp, TSO_BUG);
   16369         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) != ASIC_REV_5700 &&
   16370         [ #  # ]:          0 :                    tg3_asic_rev(tp) != ASIC_REV_5701 &&
   16371                 :            :                    tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) {
   16372                 :          0 :                 tg3_flag_set(tp, FW_TSO);
   16373                 :          0 :                 tg3_flag_set(tp, TSO_BUG);
   16374         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5705)
   16375                 :          0 :                         tp->fw_needed = FIRMWARE_TG3TSO5;
   16376                 :            :                 else
   16377                 :          0 :                         tp->fw_needed = FIRMWARE_TG3TSO;
   16378                 :            :         }
   16379                 :            : 
   16380                 :            :         /* Selectively allow TSO based on operating conditions */
   16381   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, HW_TSO_1) ||
   16382         [ #  # ]:          0 :             tg3_flag(tp, HW_TSO_2) ||
   16383         [ #  # ]:          0 :             tg3_flag(tp, HW_TSO_3) ||
   16384                 :            :             tg3_flag(tp, FW_TSO)) {
   16385                 :            :                 /* For firmware TSO, assume ASF is disabled.
   16386                 :            :                  * We'll disable TSO later if we discover ASF
   16387                 :            :                  * is enabled in tg3_get_eeprom_hw_cfg().
   16388                 :            :                  */
   16389                 :          0 :                 tg3_flag_set(tp, TSO_CAPABLE);
   16390                 :            :         } else {
   16391                 :          0 :                 tg3_flag_clear(tp, TSO_CAPABLE);
   16392                 :          0 :                 tg3_flag_clear(tp, TSO_BUG);
   16393                 :          0 :                 tp->fw_needed = NULL;
   16394                 :            :         }
   16395                 :            : 
   16396         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0)
   16397                 :          0 :                 tp->fw_needed = FIRMWARE_TG3;
   16398                 :            : 
   16399         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57766)
   16400                 :          0 :                 tp->fw_needed = FIRMWARE_TG357766;
   16401                 :            : 
   16402                 :          0 :         tp->irq_max = 1;
   16403                 :            : 
   16404         [ #  # ]:          0 :         if (tg3_flag(tp, 5750_PLUS)) {
   16405                 :          0 :                 tg3_flag_set(tp, SUPPORT_MSI);
   16406         [ #  # ]:          0 :                 if (tg3_chip_rev(tp) == CHIPREV_5750_AX ||
   16407                 :          0 :                     tg3_chip_rev(tp) == CHIPREV_5750_BX ||
   16408   [ #  #  #  # ]:          0 :                     (tg3_asic_rev(tp) == ASIC_REV_5714 &&
   16409                 :          0 :                      tg3_chip_rev_id(tp) <= CHIPREV_ID_5714_A2 &&
   16410         [ #  # ]:          0 :                      tp->pdev_peer == tp->pdev))
   16411                 :          0 :                         tg3_flag_clear(tp, SUPPORT_MSI);
   16412                 :            : 
   16413         [ #  # ]:          0 :                 if (tg3_flag(tp, 5755_PLUS) ||
   16414         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5906) {
   16415                 :          0 :                         tg3_flag_set(tp, 1SHOT_MSI);
   16416                 :            :                 }
   16417                 :            : 
   16418         [ #  # ]:          0 :                 if (tg3_flag(tp, 57765_PLUS)) {
   16419                 :          0 :                         tg3_flag_set(tp, SUPPORT_MSIX);
   16420                 :          0 :                         tp->irq_max = TG3_IRQ_MAX_VECS;
   16421                 :            :                 }
   16422                 :            :         }
   16423                 :            : 
   16424                 :          0 :         tp->txq_max = 1;
   16425                 :          0 :         tp->rxq_max = 1;
   16426         [ #  # ]:          0 :         if (tp->irq_max > 1) {
   16427                 :          0 :                 tp->rxq_max = TG3_RSS_MAX_NUM_QS;
   16428                 :          0 :                 tg3_rss_init_dflt_indir_tbl(tp, TG3_RSS_MAX_NUM_QS);
   16429                 :            : 
   16430         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5719 ||
   16431                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5720)
   16432                 :          0 :                         tp->txq_max = tp->irq_max - 1;
   16433                 :            :         }
   16434                 :            : 
   16435         [ #  # ]:          0 :         if (tg3_flag(tp, 5755_PLUS) ||
   16436         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5906)
   16437                 :          0 :                 tg3_flag_set(tp, SHORT_DMA_BUG);
   16438                 :            : 
   16439         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5719)
   16440                 :          0 :                 tp->dma_limit = TG3_TX_BD_DMA_MAX_4K;
   16441                 :            : 
   16442         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   16443         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5719 ||
   16444         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5720 ||
   16445                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762)
   16446                 :          0 :                 tg3_flag_set(tp, LRG_PROD_RING_CAP);
   16447                 :            : 
   16448         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS) &&
   16449         [ #  # ]:          0 :             tg3_chip_rev_id(tp) != CHIPREV_ID_5719_A0)
   16450                 :          0 :                 tg3_flag_set(tp, USE_JUMBO_BDFLAG);
   16451                 :            : 
   16452   [ #  #  #  # ]:          0 :         if (!tg3_flag(tp, 5705_PLUS) ||
   16453         [ #  # ]:          0 :             tg3_flag(tp, 5780_CLASS) ||
   16454                 :            :             tg3_flag(tp, USE_JUMBO_BDFLAG))
   16455                 :          0 :                 tg3_flag_set(tp, JUMBO_CAPABLE);
   16456                 :            : 
   16457                 :          0 :         pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
   16458                 :            :                               &pci_state_reg);
   16459                 :            : 
   16460         [ #  # ]:          0 :         if (pci_is_pcie(tp->pdev)) {
   16461                 :          0 :                 u16 lnkctl;
   16462                 :            : 
   16463                 :          0 :                 tg3_flag_set(tp, PCI_EXPRESS);
   16464                 :            : 
   16465                 :          0 :                 pcie_capability_read_word(tp->pdev, PCI_EXP_LNKCTL, &lnkctl);
   16466         [ #  # ]:          0 :                 if (lnkctl & PCI_EXP_LNKCTL_CLKREQ_EN) {
   16467         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
   16468                 :          0 :                                 tg3_flag_clear(tp, HW_TSO_2);
   16469                 :          0 :                                 tg3_flag_clear(tp, TSO_CAPABLE);
   16470                 :            :                         }
   16471         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5784 ||
   16472         [ #  # ]:          0 :                             tg3_asic_rev(tp) == ASIC_REV_5761 ||
   16473         [ #  # ]:          0 :                             tg3_chip_rev_id(tp) == CHIPREV_ID_57780_A0 ||
   16474                 :            :                             tg3_chip_rev_id(tp) == CHIPREV_ID_57780_A1)
   16475                 :          0 :                                 tg3_flag_set(tp, CLKREQ_BUG);
   16476         [ #  # ]:          0 :                 } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5717_A0) {
   16477                 :          0 :                         tg3_flag_set(tp, L1PLLPD_EN);
   16478                 :            :                 }
   16479         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_5785) {
   16480                 :            :                 /* BCM5785 devices are effectively PCIe devices, and should
   16481                 :            :                  * follow PCIe codepaths, but do not have a PCIe capabilities
   16482                 :            :                  * section.
   16483                 :            :                  */
   16484                 :          0 :                 tg3_flag_set(tp, PCI_EXPRESS);
   16485   [ #  #  #  # ]:          0 :         } else if (!tg3_flag(tp, 5705_PLUS) ||
   16486                 :            :                    tg3_flag(tp, 5780_CLASS)) {
   16487                 :          0 :                 tp->pcix_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_PCIX);
   16488         [ #  # ]:          0 :                 if (!tp->pcix_cap) {
   16489                 :          0 :                         dev_err(&tp->pdev->dev,
   16490                 :            :                                 "Cannot find PCI-X capability, aborting\n");
   16491                 :          0 :                         return -EIO;
   16492                 :            :                 }
   16493                 :            : 
   16494         [ #  # ]:          0 :                 if (!(pci_state_reg & PCISTATE_CONV_PCI_MODE))
   16495                 :          0 :                         tg3_flag_set(tp, PCIX_MODE);
   16496                 :            :         }
   16497                 :            : 
   16498                 :            :         /* If we have an AMD 762 or VIA K8T800 chipset, write
   16499                 :            :          * reordering to the mailbox registers done by the host
   16500                 :            :          * controller can cause major troubles.  We read back from
   16501                 :            :          * every mailbox register write to force the writes to be
   16502                 :            :          * posted to the chip in order.
   16503                 :            :          */
   16504   [ #  #  #  # ]:          0 :         if (pci_dev_present(tg3_write_reorder_chipsets) &&
   16505                 :            :             !tg3_flag(tp, PCI_EXPRESS))
   16506                 :          0 :                 tg3_flag_set(tp, MBOX_WRITE_REORDER);
   16507                 :            : 
   16508                 :          0 :         pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE,
   16509                 :            :                              &tp->pci_cacheline_sz);
   16510                 :          0 :         pci_read_config_byte(tp->pdev, PCI_LATENCY_TIMER,
   16511                 :            :                              &tp->pci_lat_timer);
   16512         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5703 &&
   16513         [ #  # ]:          0 :             tp->pci_lat_timer < 64) {
   16514                 :          0 :                 tp->pci_lat_timer = 64;
   16515                 :          0 :                 pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER,
   16516                 :            :                                       tp->pci_lat_timer);
   16517                 :            :         }
   16518                 :            : 
   16519                 :            :         /* Important! -- It is critical that the PCI-X hw workaround
   16520                 :            :          * situation is decided before the first MMIO register access.
   16521                 :            :          */
   16522         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5700_BX) {
   16523                 :            :                 /* 5700 BX chips need to have their TX producer index
   16524                 :            :                  * mailboxes written twice to workaround a bug.
   16525                 :            :                  */
   16526                 :          0 :                 tg3_flag_set(tp, TXD_MBOX_HWBUG);
   16527                 :            : 
   16528                 :            :                 /* If we are in PCI-X mode, enable register write workaround.
   16529                 :            :                  *
   16530                 :            :                  * The workaround is to use indirect register accesses
   16531                 :            :                  * for all chip writes not to mailbox registers.
   16532                 :            :                  */
   16533         [ #  # ]:          0 :                 if (tg3_flag(tp, PCIX_MODE)) {
   16534                 :          0 :                         u32 pm_reg;
   16535                 :            : 
   16536                 :          0 :                         tg3_flag_set(tp, PCIX_TARGET_HWBUG);
   16537                 :            : 
   16538                 :            :                         /* The chip can have it's power management PCI config
   16539                 :            :                          * space registers clobbered due to this bug.
   16540                 :            :                          * So explicitly force the chip into D0 here.
   16541                 :            :                          */
   16542                 :          0 :                         pci_read_config_dword(tp->pdev,
   16543                 :          0 :                                               tp->pdev->pm_cap + PCI_PM_CTRL,
   16544                 :            :                                               &pm_reg);
   16545                 :          0 :                         pm_reg &= ~PCI_PM_CTRL_STATE_MASK;
   16546                 :          0 :                         pm_reg |= PCI_PM_CTRL_PME_ENABLE | 0 /* D0 */;
   16547                 :          0 :                         pci_write_config_dword(tp->pdev,
   16548                 :          0 :                                                tp->pdev->pm_cap + PCI_PM_CTRL,
   16549                 :            :                                                pm_reg);
   16550                 :            : 
   16551                 :            :                         /* Also, force SERR#/PERR# in PCI command. */
   16552                 :          0 :                         pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
   16553                 :          0 :                         pci_cmd |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
   16554                 :          0 :                         pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
   16555                 :            :                 }
   16556                 :            :         }
   16557                 :            : 
   16558         [ #  # ]:          0 :         if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0)
   16559                 :          0 :                 tg3_flag_set(tp, PCI_HIGH_SPEED);
   16560         [ #  # ]:          0 :         if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0)
   16561                 :          0 :                 tg3_flag_set(tp, PCI_32BIT);
   16562                 :            : 
   16563                 :            :         /* Chip-specific fixup from Broadcom driver */
   16564         [ #  # ]:          0 :         if ((tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0) &&
   16565         [ #  # ]:          0 :             (!(pci_state_reg & PCISTATE_RETRY_SAME_DMA))) {
   16566                 :          0 :                 pci_state_reg |= PCISTATE_RETRY_SAME_DMA;
   16567                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, pci_state_reg);
   16568                 :            :         }
   16569                 :            : 
   16570                 :            :         /* Default fast path register access methods */
   16571                 :          0 :         tp->read32 = tg3_read32;
   16572                 :          0 :         tp->write32 = tg3_write32;
   16573                 :          0 :         tp->read32_mbox = tg3_read32;
   16574                 :          0 :         tp->write32_mbox = tg3_write32;
   16575                 :          0 :         tp->write32_tx_mbox = tg3_write32;
   16576                 :          0 :         tp->write32_rx_mbox = tg3_write32;
   16577                 :            : 
   16578                 :            :         /* Various workaround register access methods */
   16579         [ #  # ]:          0 :         if (tg3_flag(tp, PCIX_TARGET_HWBUG))
   16580                 :          0 :                 tp->write32 = tg3_write_indirect_reg32;
   16581   [ #  #  #  # ]:          0 :         else if (tg3_asic_rev(tp) == ASIC_REV_5701 ||
   16582                 :          0 :                  (tg3_flag(tp, PCI_EXPRESS) &&
   16583         [ #  # ]:          0 :                   tg3_chip_rev_id(tp) == CHIPREV_ID_5750_A0)) {
   16584                 :            :                 /*
   16585                 :            :                  * Back to back register writes can cause problems on these
   16586                 :            :                  * chips, the workaround is to read back all reg writes
   16587                 :            :                  * except those to mailbox regs.
   16588                 :            :                  *
   16589                 :            :                  * See tg3_write_indirect_reg32().
   16590                 :            :                  */
   16591                 :          0 :                 tp->write32 = tg3_write_flush_reg32;
   16592                 :            :         }
   16593                 :            : 
   16594   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, TXD_MBOX_HWBUG) || tg3_flag(tp, MBOX_WRITE_REORDER)) {
   16595                 :          0 :                 tp->write32_tx_mbox = tg3_write32_tx_mbox;
   16596         [ #  # ]:          0 :                 if (tg3_flag(tp, MBOX_WRITE_REORDER))
   16597                 :          0 :                         tp->write32_rx_mbox = tg3_write_flush_reg32;
   16598                 :            :         }
   16599                 :            : 
   16600         [ #  # ]:          0 :         if (tg3_flag(tp, ICH_WORKAROUND)) {
   16601                 :          0 :                 tp->read32 = tg3_read_indirect_reg32;
   16602                 :          0 :                 tp->write32 = tg3_write_indirect_reg32;
   16603                 :          0 :                 tp->read32_mbox = tg3_read_indirect_mbox;
   16604                 :          0 :                 tp->write32_mbox = tg3_write_indirect_mbox;
   16605                 :          0 :                 tp->write32_tx_mbox = tg3_write_indirect_mbox;
   16606                 :          0 :                 tp->write32_rx_mbox = tg3_write_indirect_mbox;
   16607                 :            : 
   16608                 :          0 :                 iounmap(tp->regs);
   16609                 :          0 :                 tp->regs = NULL;
   16610                 :            : 
   16611                 :          0 :                 pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
   16612                 :          0 :                 pci_cmd &= ~PCI_COMMAND_MEMORY;
   16613                 :          0 :                 pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
   16614                 :            :         }
   16615         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906) {
   16616                 :          0 :                 tp->read32_mbox = tg3_read32_mbox_5906;
   16617                 :          0 :                 tp->write32_mbox = tg3_write32_mbox_5906;
   16618                 :          0 :                 tp->write32_tx_mbox = tg3_write32_mbox_5906;
   16619                 :          0 :                 tp->write32_rx_mbox = tg3_write32_mbox_5906;
   16620                 :            :         }
   16621                 :            : 
   16622   [ #  #  #  # ]:          0 :         if (tp->write32 == tg3_write_indirect_reg32 ||
   16623                 :          0 :             (tg3_flag(tp, PCIX_MODE) &&
   16624         [ #  # ]:          0 :              (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   16625                 :            :               tg3_asic_rev(tp) == ASIC_REV_5701)))
   16626                 :          0 :                 tg3_flag_set(tp, SRAM_USE_CONFIG);
   16627                 :            : 
   16628                 :            :         /* The memory arbiter has to be enabled in order for SRAM accesses
   16629                 :            :          * to succeed.  Normally on powerup the tg3 chip firmware will make
   16630                 :            :          * sure it is enabled, but other entities such as system netboot
   16631                 :            :          * code might disable it.
   16632                 :            :          */
   16633                 :          0 :         val = tr32(MEMARB_MODE);
   16634                 :          0 :         tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
   16635                 :            : 
   16636                 :          0 :         tp->pci_fn = PCI_FUNC(tp->pdev->devfn) & 3;
   16637   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5704 ||
   16638                 :            :             tg3_flag(tp, 5780_CLASS)) {
   16639         [ #  # ]:          0 :                 if (tg3_flag(tp, PCIX_MODE)) {
   16640                 :          0 :                         pci_read_config_dword(tp->pdev,
   16641                 :          0 :                                               tp->pcix_cap + PCI_X_STATUS,
   16642                 :            :                                               &val);
   16643                 :          0 :                         tp->pci_fn = val & 0x7;
   16644                 :            :                 }
   16645         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   16646         [ #  # ]:          0 :                    tg3_asic_rev(tp) == ASIC_REV_5719 ||
   16647                 :            :                    tg3_asic_rev(tp) == ASIC_REV_5720) {
   16648                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_CPMU_STATUS, &val);
   16649         [ #  # ]:          0 :                 if ((val & NIC_SRAM_CPMUSTAT_SIG_MSK) != NIC_SRAM_CPMUSTAT_SIG)
   16650                 :          0 :                         val = tr32(TG3_CPMU_STATUS);
   16651                 :            : 
   16652         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5717)
   16653                 :          0 :                         tp->pci_fn = (val & TG3_CPMU_STATUS_FMSK_5717) ? 1 : 0;
   16654                 :            :                 else
   16655                 :          0 :                         tp->pci_fn = (val & TG3_CPMU_STATUS_FMSK_5719) >>
   16656                 :            :                                      TG3_CPMU_STATUS_FSHFT_5719;
   16657                 :            :         }
   16658                 :            : 
   16659         [ #  # ]:          0 :         if (tg3_flag(tp, FLUSH_POSTED_WRITES)) {
   16660                 :          0 :                 tp->write32_tx_mbox = tg3_write_flush_reg32;
   16661                 :          0 :                 tp->write32_rx_mbox = tg3_write_flush_reg32;
   16662                 :            :         }
   16663                 :            : 
   16664                 :            :         /* Get eeprom hw config before calling tg3_set_power_state().
   16665                 :            :          * In particular, the TG3_FLAG_IS_NIC flag must be
   16666                 :            :          * determined before calling tg3_set_power_state() so that
   16667                 :            :          * we know whether or not to switch out of Vaux power.
   16668                 :            :          * When the flag is set, it means that GPIO1 is used for eeprom
   16669                 :            :          * write protect and also implies that it is a LOM where GPIOs
   16670                 :            :          * are not used to switch power.
   16671                 :            :          */
   16672                 :          0 :         tg3_get_eeprom_hw_cfg(tp);
   16673                 :            : 
   16674   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, FW_TSO) && tg3_flag(tp, ENABLE_ASF)) {
   16675                 :          0 :                 tg3_flag_clear(tp, TSO_CAPABLE);
   16676                 :          0 :                 tg3_flag_clear(tp, TSO_BUG);
   16677                 :          0 :                 tp->fw_needed = NULL;
   16678                 :            :         }
   16679                 :            : 
   16680         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE)) {
   16681                 :            :                 /* Allow reads and writes to the
   16682                 :            :                  * APE register and memory space.
   16683                 :            :                  */
   16684                 :          0 :                 pci_state_reg |= PCISTATE_ALLOW_APE_CTLSPC_WR |
   16685                 :            :                                  PCISTATE_ALLOW_APE_SHMEM_WR |
   16686                 :            :                                  PCISTATE_ALLOW_APE_PSPACE_WR;
   16687                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE,
   16688                 :            :                                        pci_state_reg);
   16689                 :            : 
   16690                 :          0 :                 tg3_ape_lock_init(tp);
   16691                 :          0 :                 tp->ape_hb_interval =
   16692                 :            :                         msecs_to_jiffies(APE_HOST_HEARTBEAT_INT_5SEC);
   16693                 :            :         }
   16694                 :            : 
   16695                 :            :         /* Set up tp->grc_local_ctrl before calling
   16696                 :            :          * tg3_pwrsrc_switch_to_vmain().  GPIO1 driven high
   16697                 :            :          * will bring 5700's external PHY out of reset.
   16698                 :            :          * It is also used as eeprom write protect on LOMs.
   16699                 :            :          */
   16700                 :          0 :         tp->grc_local_ctrl = GRC_LCLCTRL_INT_ON_ATTN | GRC_LCLCTRL_AUTO_SEEPROM;
   16701   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   16702                 :            :             tg3_flag(tp, EEPROM_WRITE_PROT))
   16703                 :          0 :                 tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
   16704                 :            :                                        GRC_LCLCTRL_GPIO_OUTPUT1);
   16705                 :            :         /* Unused GPIO3 must be driven as output on 5752 because there
   16706                 :            :          * are no pull-up resistors on unused GPIO pins.
   16707                 :            :          */
   16708         [ #  # ]:          0 :         else if (tg3_asic_rev(tp) == ASIC_REV_5752)
   16709                 :          0 :                 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
   16710                 :            : 
   16711         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5755 ||
   16712         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_57780 ||
   16713                 :            :             tg3_flag(tp, 57765_CLASS))
   16714                 :          0 :                 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL;
   16715                 :            : 
   16716         [ #  # ]:          0 :         if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 ||
   16717                 :            :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S) {
   16718                 :            :                 /* Turn off the debug UART. */
   16719                 :          0 :                 tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL;
   16720         [ #  # ]:          0 :                 if (tg3_flag(tp, IS_NIC))
   16721                 :            :                         /* Keep VMain power. */
   16722                 :          0 :                         tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 |
   16723                 :            :                                               GRC_LCLCTRL_GPIO_OUTPUT0;
   16724                 :            :         }
   16725                 :            : 
   16726         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5762)
   16727                 :          0 :                 tp->grc_local_ctrl |=
   16728                 :          0 :                         tr32(GRC_LOCAL_CTRL) & GRC_LCLCTRL_GPIO_UART_SEL;
   16729                 :            : 
   16730                 :            :         /* Switch out of Vaux if it is a NIC */
   16731                 :          0 :         tg3_pwrsrc_switch_to_vmain(tp);
   16732                 :            : 
   16733                 :            :         /* Derive initial jumbo mode from MTU assigned in
   16734                 :            :          * ether_setup() via the alloc_etherdev() call
   16735                 :            :          */
   16736   [ #  #  #  # ]:          0 :         if (tp->dev->mtu > ETH_DATA_LEN && !tg3_flag(tp, 5780_CLASS))
   16737                 :          0 :                 tg3_flag_set(tp, JUMBO_RING_ENABLE);
   16738                 :            : 
   16739                 :            :         /* Determine WakeOnLan speed to use. */
   16740   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   16741         [ #  # ]:          0 :             tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 ||
   16742         [ #  # ]:          0 :             tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0 ||
   16743                 :            :             tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B2) {
   16744                 :          0 :                 tg3_flag_clear(tp, WOL_SPEED_100MB);
   16745                 :            :         } else {
   16746                 :          0 :                 tg3_flag_set(tp, WOL_SPEED_100MB);
   16747                 :            :         }
   16748                 :            : 
   16749         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5906)
   16750                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_IS_FET;
   16751                 :            : 
   16752                 :            :         /* A few boards don't want Ethernet@WireSpeed phy feature */
   16753   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   16754         [ #  # ]:          0 :             (tg3_asic_rev(tp) == ASIC_REV_5705 &&
   16755         [ #  # ]:          0 :              (tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) &&
   16756                 :            :              (tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A1)) ||
   16757         [ #  # ]:          0 :             (tp->phy_flags & TG3_PHYFLG_IS_FET) ||
   16758                 :            :             (tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
   16759                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_NO_ETH_WIRE_SPEED;
   16760                 :            : 
   16761         [ #  # ]:          0 :         if (tg3_chip_rev(tp) == CHIPREV_5703_AX ||
   16762                 :            :             tg3_chip_rev(tp) == CHIPREV_5704_AX)
   16763                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_ADC_BUG;
   16764         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5704_A0)
   16765                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_5704_A0_BUG;
   16766                 :            : 
   16767         [ #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS) &&
   16768         [ #  # ]:          0 :             !(tp->phy_flags & TG3_PHYFLG_IS_FET) &&
   16769   [ #  #  #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5785 &&
   16770         [ #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_57780 &&
   16771                 :            :             !tg3_flag(tp, 57765_PLUS)) {
   16772                 :          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5755 ||
   16773         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5787 ||
   16774         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5784 ||
   16775                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5761) {
   16776         [ #  # ]:          0 :                         if (tp->pdev->device != PCI_DEVICE_ID_TIGON3_5756 &&
   16777                 :            :                             tp->pdev->device != PCI_DEVICE_ID_TIGON3_5722)
   16778                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_JITTER_BUG;
   16779         [ #  # ]:          0 :                         if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5755M)
   16780                 :          0 :                                 tp->phy_flags |= TG3_PHYFLG_ADJUST_TRIM;
   16781                 :            :                 } else
   16782                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_BER_BUG;
   16783                 :            :         }
   16784                 :            : 
   16785         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5784 &&
   16786         [ #  # ]:          0 :             tg3_chip_rev(tp) != CHIPREV_5784_AX) {
   16787                 :          0 :                 tp->phy_otp = tg3_read_otp_phycfg(tp);
   16788         [ #  # ]:          0 :                 if (tp->phy_otp == 0)
   16789                 :          0 :                         tp->phy_otp = TG3_OTP_DEFAULT;
   16790                 :            :         }
   16791                 :            : 
   16792         [ #  # ]:          0 :         if (tg3_flag(tp, CPMU_PRESENT))
   16793                 :          0 :                 tp->mi_mode = MAC_MI_MODE_500KHZ_CONST;
   16794                 :            :         else
   16795                 :          0 :                 tp->mi_mode = MAC_MI_MODE_BASE;
   16796                 :            : 
   16797                 :          0 :         tp->coalesce_mode = 0;
   16798         [ #  # ]:          0 :         if (tg3_chip_rev(tp) != CHIPREV_5700_AX &&
   16799                 :            :             tg3_chip_rev(tp) != CHIPREV_5700_BX)
   16800                 :          0 :                 tp->coalesce_mode |= HOSTCC_MODE_32BYTE;
   16801                 :            : 
   16802                 :            :         /* Set these bits to enable statistics workaround. */
   16803         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
   16804         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5762 ||
   16805         [ #  # ]:          0 :             tg3_chip_rev_id(tp) == CHIPREV_ID_5719_A0 ||
   16806                 :            :             tg3_chip_rev_id(tp) == CHIPREV_ID_5720_A0) {
   16807                 :          0 :                 tp->coalesce_mode |= HOSTCC_MODE_ATTN;
   16808                 :          0 :                 tp->grc_mode |= GRC_MODE_IRQ_ON_FLOW_ATTN;
   16809                 :            :         }
   16810                 :            : 
   16811         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5785 ||
   16812                 :            :             tg3_asic_rev(tp) == ASIC_REV_57780)
   16813                 :          0 :                 tg3_flag_set(tp, USE_PHYLIB);
   16814                 :            : 
   16815                 :          0 :         err = tg3_mdio_init(tp);
   16816         [ #  # ]:          0 :         if (err)
   16817                 :            :                 return err;
   16818                 :            : 
   16819                 :            :         /* Initialize data/descriptor byte/word swapping. */
   16820                 :          0 :         val = tr32(GRC_MODE);
   16821         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5720 ||
   16822                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762)
   16823                 :          0 :                 val &= (GRC_MODE_BYTE_SWAP_B2HRX_DATA |
   16824                 :            :                         GRC_MODE_WORD_SWAP_B2HRX_DATA |
   16825                 :            :                         GRC_MODE_B2HRX_ENABLE |
   16826                 :            :                         GRC_MODE_HTX2B_ENABLE |
   16827                 :            :                         GRC_MODE_HOST_STACKUP);
   16828                 :            :         else
   16829                 :          0 :                 val &= GRC_MODE_HOST_STACKUP;
   16830                 :            : 
   16831                 :          0 :         tw32(GRC_MODE, val | tp->grc_mode);
   16832                 :            : 
   16833                 :          0 :         tg3_switch_clocks(tp);
   16834                 :            : 
   16835                 :            :         /* Clear this out for sanity. */
   16836                 :          0 :         tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
   16837                 :            : 
   16838                 :            :         /* Clear TG3PCI_REG_BASE_ADDR to prevent hangs. */
   16839                 :          0 :         tw32(TG3PCI_REG_BASE_ADDR, 0);
   16840                 :            : 
   16841                 :          0 :         pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE,
   16842                 :            :                               &pci_state_reg);
   16843   [ #  #  #  # ]:          0 :         if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0 &&
   16844                 :            :             !tg3_flag(tp, PCIX_TARGET_HWBUG)) {
   16845         [ #  # ]:          0 :                 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0 ||
   16846         [ #  # ]:          0 :                     tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B0 ||
   16847         [ #  # ]:          0 :                     tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B2 ||
   16848                 :            :                     tg3_chip_rev_id(tp) == CHIPREV_ID_5701_B5) {
   16849                 :          0 :                         void __iomem *sram_base;
   16850                 :            : 
   16851                 :            :                         /* Write some dummy words into the SRAM status block
   16852                 :            :                          * area, see if it reads back correctly.  If the return
   16853                 :            :                          * value is bad, force enable the PCIX workaround.
   16854                 :            :                          */
   16855                 :          0 :                         sram_base = tp->regs + NIC_SRAM_WIN_BASE + NIC_SRAM_STATS_BLK;
   16856                 :            : 
   16857                 :          0 :                         writel(0x00000000, sram_base);
   16858                 :          0 :                         writel(0x00000000, sram_base + 4);
   16859                 :          0 :                         writel(0xffffffff, sram_base + 4);
   16860         [ #  # ]:          0 :                         if (readl(sram_base) != 0x00000000)
   16861                 :          0 :                                 tg3_flag_set(tp, PCIX_TARGET_HWBUG);
   16862                 :            :                 }
   16863                 :            :         }
   16864                 :            : 
   16865                 :          0 :         udelay(50);
   16866                 :          0 :         tg3_nvram_init(tp);
   16867                 :            : 
   16868                 :            :         /* If the device has an NVRAM, no need to load patch firmware */
   16869   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_57766 &&
   16870                 :            :             !tg3_flag(tp, NO_NVRAM))
   16871                 :          0 :                 tp->fw_needed = NULL;
   16872                 :            : 
   16873                 :          0 :         grc_misc_cfg = tr32(GRC_MISC_CFG);
   16874                 :          0 :         grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK;
   16875                 :            : 
   16876         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5705 &&
   16877                 :          0 :             (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 ||
   16878         [ #  # ]:          0 :              grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M))
   16879                 :          0 :                 tg3_flag_set(tp, IS_5788);
   16880                 :            : 
   16881         [ #  # ]:          0 :         if (!tg3_flag(tp, IS_5788) &&
   16882         [ #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5700)
   16883                 :          0 :                 tg3_flag_set(tp, TAGGED_STATUS);
   16884         [ #  # ]:          0 :         if (tg3_flag(tp, TAGGED_STATUS)) {
   16885                 :          0 :                 tp->coalesce_mode |= (HOSTCC_MODE_CLRTICK_RXBD |
   16886                 :            :                                       HOSTCC_MODE_CLRTICK_TXBD);
   16887                 :            : 
   16888                 :          0 :                 tp->misc_host_ctrl |= MISC_HOST_CTRL_TAGGED_STATUS;
   16889                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
   16890                 :            :                                        tp->misc_host_ctrl);
   16891                 :            :         }
   16892                 :            : 
   16893                 :            :         /* Preserve the APE MAC_MODE bits */
   16894         [ #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE))
   16895                 :          0 :                 tp->mac_mode = MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN;
   16896                 :            :         else
   16897                 :          0 :                 tp->mac_mode = 0;
   16898                 :            : 
   16899         [ #  # ]:          0 :         if (tg3_10_100_only_device(tp, ent))
   16900                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_10_100_ONLY;
   16901                 :            : 
   16902                 :          0 :         err = tg3_phy_probe(tp);
   16903         [ #  # ]:          0 :         if (err) {
   16904                 :          0 :                 dev_err(&tp->pdev->dev, "phy probe failed, err %d\n", err);
   16905                 :            :                 /* ... but do not return immediately ... */
   16906                 :          0 :                 tg3_mdio_fini(tp);
   16907                 :            :         }
   16908                 :            : 
   16909                 :          0 :         tg3_read_vpd(tp);
   16910                 :          0 :         tg3_read_fw_ver(tp);
   16911                 :            : 
   16912         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) {
   16913                 :          0 :                 tp->phy_flags &= ~TG3_PHYFLG_USE_MI_INTERRUPT;
   16914                 :            :         } else {
   16915         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5700)
   16916                 :          0 :                         tp->phy_flags |= TG3_PHYFLG_USE_MI_INTERRUPT;
   16917                 :            :                 else
   16918                 :          0 :                         tp->phy_flags &= ~TG3_PHYFLG_USE_MI_INTERRUPT;
   16919                 :            :         }
   16920                 :            : 
   16921                 :            :         /* 5700 {AX,BX} chips have a broken status block link
   16922                 :            :          * change bit implementation, so we must use the
   16923                 :            :          * status register in those cases.
   16924                 :            :          */
   16925         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700)
   16926                 :          0 :                 tg3_flag_set(tp, USE_LINKCHG_REG);
   16927                 :            :         else
   16928                 :          0 :                 tg3_flag_clear(tp, USE_LINKCHG_REG);
   16929                 :            : 
   16930                 :            :         /* The led_ctrl is set during tg3_phy_probe, here we might
   16931                 :            :          * have to force the link status polling mechanism based
   16932                 :            :          * upon subsystem IDs.
   16933                 :            :          */
   16934         [ #  # ]:          0 :         if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
   16935         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5701 &&
   16936         [ #  # ]:          0 :             !(tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) {
   16937                 :          0 :                 tp->phy_flags |= TG3_PHYFLG_USE_MI_INTERRUPT;
   16938                 :          0 :                 tg3_flag_set(tp, USE_LINKCHG_REG);
   16939                 :            :         }
   16940                 :            : 
   16941                 :            :         /* For all SERDES we poll the MAC status register. */
   16942         [ #  # ]:          0 :         if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
   16943                 :          0 :                 tg3_flag_set(tp, POLL_SERDES);
   16944                 :            :         else
   16945                 :          0 :                 tg3_flag_clear(tp, POLL_SERDES);
   16946                 :            : 
   16947   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, ENABLE_APE) && tg3_flag(tp, ENABLE_ASF))
   16948                 :          0 :                 tg3_flag_set(tp, POLL_CPMU_LINK);
   16949                 :            : 
   16950                 :          0 :         tp->rx_offset = NET_SKB_PAD + NET_IP_ALIGN;
   16951                 :          0 :         tp->rx_copy_thresh = TG3_RX_COPY_THRESHOLD;
   16952   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5701 &&
   16953                 :            :             tg3_flag(tp, PCIX_MODE)) {
   16954                 :          0 :                 tp->rx_offset = NET_SKB_PAD;
   16955                 :            : #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
   16956                 :            :                 tp->rx_copy_thresh = ~(u16)0;
   16957                 :            : #endif
   16958                 :            :         }
   16959                 :            : 
   16960         [ #  # ]:          0 :         tp->rx_std_ring_mask = TG3_RX_STD_RING_SIZE(tp) - 1;
   16961         [ #  # ]:          0 :         tp->rx_jmb_ring_mask = TG3_RX_JMB_RING_SIZE(tp) - 1;
   16962                 :          0 :         tp->rx_ret_ring_mask = tg3_rx_ret_ring_size(tp) - 1;
   16963                 :            : 
   16964                 :          0 :         tp->rx_std_max_post = tp->rx_std_ring_mask + 1;
   16965                 :            : 
   16966                 :            :         /* Increment the rx prod index on the rx std ring by at most
   16967                 :            :          * 8 for these chips to workaround hw errata.
   16968                 :            :          */
   16969         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5750 ||
   16970         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5752 ||
   16971                 :            :             tg3_asic_rev(tp) == ASIC_REV_5755)
   16972                 :          0 :                 tp->rx_std_max_post = 8;
   16973                 :            : 
   16974         [ #  # ]:          0 :         if (tg3_flag(tp, ASPM_WORKAROUND))
   16975                 :          0 :                 tp->pwrmgmt_thresh = tr32(PCIE_PWR_MGMT_THRESH) &
   16976                 :            :                                      PCIE_PWR_MGMT_L1_THRESH_MSK;
   16977                 :            : 
   16978                 :            :         return err;
   16979                 :            : }
   16980                 :            : 
   16981                 :          0 : static int tg3_get_device_address(struct tg3 *tp)
   16982                 :            : {
   16983                 :          0 :         struct net_device *dev = tp->dev;
   16984                 :          0 :         u32 hi, lo, mac_offset;
   16985                 :          0 :         int addr_ok = 0;
   16986                 :          0 :         int err;
   16987                 :            : 
   16988         [ #  # ]:          0 :         if (!eth_platform_get_mac_address(&tp->pdev->dev, dev->dev_addr))
   16989                 :            :                 return 0;
   16990                 :            : 
   16991                 :          0 :         if (tg3_flag(tp, IS_SSB_CORE)) {
   16992                 :            :                 err = ssb_gige_get_macaddr(tp->pdev, &dev->dev_addr[0]);
   16993                 :            :                 if (!err && is_valid_ether_addr(&dev->dev_addr[0]))
   16994                 :            :                         return 0;
   16995                 :            :         }
   16996                 :            : 
   16997                 :          0 :         mac_offset = 0x7c;
   16998   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5704 ||
   16999                 :            :             tg3_flag(tp, 5780_CLASS)) {
   17000         [ #  # ]:          0 :                 if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
   17001                 :          0 :                         mac_offset = 0xcc;
   17002         [ #  # ]:          0 :                 if (tg3_nvram_lock(tp))
   17003                 :          0 :                         tw32_f(NVRAM_CMD, NVRAM_CMD_RESET);
   17004                 :            :                 else
   17005                 :          0 :                         tg3_nvram_unlock(tp);
   17006         [ #  # ]:          0 :         } else if (tg3_flag(tp, 5717_PLUS)) {
   17007         [ #  # ]:          0 :                 if (tp->pci_fn & 1)
   17008                 :          0 :                         mac_offset = 0xcc;
   17009         [ #  # ]:          0 :                 if (tp->pci_fn > 1)
   17010                 :          0 :                         mac_offset += 0x18c;
   17011         [ #  # ]:          0 :         } else if (tg3_asic_rev(tp) == ASIC_REV_5906)
   17012                 :          0 :                 mac_offset = 0x10;
   17013                 :            : 
   17014                 :            :         /* First try to get it from MAC address mailbox. */
   17015                 :          0 :         tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
   17016         [ #  # ]:          0 :         if ((hi >> 16) == 0x484b) {
   17017                 :          0 :                 dev->dev_addr[0] = (hi >>  8) & 0xff;
   17018                 :          0 :                 dev->dev_addr[1] = (hi >>  0) & 0xff;
   17019                 :            : 
   17020                 :          0 :                 tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo);
   17021                 :          0 :                 dev->dev_addr[2] = (lo >> 24) & 0xff;
   17022                 :          0 :                 dev->dev_addr[3] = (lo >> 16) & 0xff;
   17023                 :          0 :                 dev->dev_addr[4] = (lo >>  8) & 0xff;
   17024                 :          0 :                 dev->dev_addr[5] = (lo >>  0) & 0xff;
   17025                 :            : 
   17026                 :            :                 /* Some old bootcode may report a 0 MAC address in SRAM */
   17027         [ #  # ]:          0 :                 addr_ok = is_valid_ether_addr(&dev->dev_addr[0]);
   17028                 :            :         }
   17029                 :            :         if (!addr_ok) {
   17030                 :            :                 /* Next, try NVRAM. */
   17031   [ #  #  #  # ]:          0 :                 if (!tg3_flag(tp, NO_NVRAM) &&
   17032         [ #  # ]:          0 :                     !tg3_nvram_read_be32(tp, mac_offset + 0, &hi) &&
   17033                 :          0 :                     !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) {
   17034                 :          0 :                         memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2);
   17035                 :          0 :                         memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo));
   17036                 :            :                 }
   17037                 :            :                 /* Finally just fetch it out of the MAC control regs. */
   17038                 :            :                 else {
   17039                 :          0 :                         hi = tr32(MAC_ADDR_0_HIGH);
   17040                 :          0 :                         lo = tr32(MAC_ADDR_0_LOW);
   17041                 :            : 
   17042                 :          0 :                         dev->dev_addr[5] = lo & 0xff;
   17043                 :          0 :                         dev->dev_addr[4] = (lo >> 8) & 0xff;
   17044                 :          0 :                         dev->dev_addr[3] = (lo >> 16) & 0xff;
   17045                 :          0 :                         dev->dev_addr[2] = (lo >> 24) & 0xff;
   17046                 :          0 :                         dev->dev_addr[1] = hi & 0xff;
   17047                 :          0 :                         dev->dev_addr[0] = (hi >> 8) & 0xff;
   17048                 :            :                 }
   17049                 :            :         }
   17050                 :            : 
   17051   [ #  #  #  # ]:          0 :         if (!is_valid_ether_addr(&dev->dev_addr[0]))
   17052                 :          0 :                 return -EINVAL;
   17053                 :            :         return 0;
   17054                 :            : }
   17055                 :            : 
   17056                 :            : #define BOUNDARY_SINGLE_CACHELINE       1
   17057                 :            : #define BOUNDARY_MULTI_CACHELINE        2
   17058                 :            : 
   17059                 :          0 : static u32 tg3_calc_dma_bndry(struct tg3 *tp, u32 val)
   17060                 :            : {
   17061                 :          0 :         int cacheline_size;
   17062                 :          0 :         u8 byte;
   17063                 :          0 :         int goal;
   17064                 :            : 
   17065                 :          0 :         pci_read_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, &byte);
   17066                 :          0 :         if (byte == 0)
   17067                 :            :                 cacheline_size = 1024;
   17068                 :            :         else
   17069                 :            :                 cacheline_size = (int) byte * 4;
   17070                 :            : 
   17071                 :            :         /* On 5703 and later chips, the boundary bits have no
   17072                 :            :          * effect.
   17073                 :            :          */
   17074         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5700 &&
   17075         [ #  # ]:          0 :             tg3_asic_rev(tp) != ASIC_REV_5701 &&
   17076                 :          0 :             !tg3_flag(tp, PCI_EXPRESS))
   17077                 :          0 :                 goto out;
   17078                 :            : 
   17079                 :            : #if defined(CONFIG_PPC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC)
   17080                 :            :         goal = BOUNDARY_MULTI_CACHELINE;
   17081                 :            : #else
   17082                 :            : #if defined(CONFIG_SPARC64) || defined(CONFIG_ALPHA)
   17083                 :            :         goal = BOUNDARY_SINGLE_CACHELINE;
   17084                 :            : #else
   17085                 :          0 :         goal = 0;
   17086                 :            : #endif
   17087                 :            : #endif
   17088                 :            : 
   17089         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS)) {
   17090                 :          0 :                 val = goal ? 0 : DMA_RWCTRL_DIS_CACHE_ALIGNMENT;
   17091                 :          0 :                 goto out;
   17092                 :            :         }
   17093                 :            : 
   17094                 :          0 :         if (!goal)
   17095                 :          0 :                 goto out;
   17096                 :            : 
   17097                 :            :         /* PCI controllers on most RISC systems tend to disconnect
   17098                 :            :          * when a device tries to burst across a cache-line boundary.
   17099                 :            :          * Therefore, letting tg3 do so just wastes PCI bandwidth.
   17100                 :            :          *
   17101                 :            :          * Unfortunately, for PCI-E there are only limited
   17102                 :            :          * write-side controls for this, and thus for reads
   17103                 :            :          * we will still get the disconnects.  We'll also waste
   17104                 :            :          * these PCI cycles for both read and write for chips
   17105                 :            :          * other than 5700 and 5701 which do not implement the
   17106                 :            :          * boundary bits.
   17107                 :            :          */
   17108                 :            :         if (tg3_flag(tp, PCIX_MODE) && !tg3_flag(tp, PCI_EXPRESS)) {
   17109                 :            :                 switch (cacheline_size) {
   17110                 :            :                 case 16:
   17111                 :            :                 case 32:
   17112                 :            :                 case 64:
   17113                 :            :                 case 128:
   17114                 :            :                         if (goal == BOUNDARY_SINGLE_CACHELINE) {
   17115                 :            :                                 val |= (DMA_RWCTRL_READ_BNDRY_128_PCIX |
   17116                 :            :                                         DMA_RWCTRL_WRITE_BNDRY_128_PCIX);
   17117                 :            :                         } else {
   17118                 :            :                                 val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
   17119                 :            :                                         DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
   17120                 :            :                         }
   17121                 :            :                         break;
   17122                 :            : 
   17123                 :            :                 case 256:
   17124                 :            :                         val |= (DMA_RWCTRL_READ_BNDRY_256_PCIX |
   17125                 :            :                                 DMA_RWCTRL_WRITE_BNDRY_256_PCIX);
   17126                 :            :                         break;
   17127                 :            : 
   17128                 :            :                 default:
   17129                 :            :                         val |= (DMA_RWCTRL_READ_BNDRY_384_PCIX |
   17130                 :            :                                 DMA_RWCTRL_WRITE_BNDRY_384_PCIX);
   17131                 :            :                         break;
   17132                 :            :                 }
   17133                 :            :         } else if (tg3_flag(tp, PCI_EXPRESS)) {
   17134                 :            :                 switch (cacheline_size) {
   17135                 :            :                 case 16:
   17136                 :            :                 case 32:
   17137                 :            :                 case 64:
   17138                 :            :                         if (goal == BOUNDARY_SINGLE_CACHELINE) {
   17139                 :            :                                 val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
   17140                 :            :                                 val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE;
   17141                 :            :                                 break;
   17142                 :            :                         }
   17143                 :            :                         /* fallthrough */
   17144                 :            :                 case 128:
   17145                 :            :                 default:
   17146                 :            :                         val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE;
   17147                 :            :                         val |= DMA_RWCTRL_WRITE_BNDRY_128_PCIE;
   17148                 :            :                         break;
   17149                 :            :                 }
   17150                 :            :         } else {
   17151                 :            :                 switch (cacheline_size) {
   17152                 :            :                 case 16:
   17153                 :            :                         if (goal == BOUNDARY_SINGLE_CACHELINE) {
   17154                 :            :                                 val |= (DMA_RWCTRL_READ_BNDRY_16 |
   17155                 :            :                                         DMA_RWCTRL_WRITE_BNDRY_16);
   17156                 :            :                                 break;
   17157                 :            :                         }
   17158                 :            :                         /* fallthrough */
   17159                 :            :                 case 32:
   17160                 :            :                         if (goal == BOUNDARY_SINGLE_CACHELINE) {
   17161                 :            :                                 val |= (DMA_RWCTRL_READ_BNDRY_32 |
   17162                 :            :                                         DMA_RWCTRL_WRITE_BNDRY_32);
   17163                 :            :                                 break;
   17164                 :            :                         }
   17165                 :            :                         /* fallthrough */
   17166                 :            :                 case 64:
   17167                 :            :                         if (goal == BOUNDARY_SINGLE_CACHELINE) {
   17168                 :            :                                 val |= (DMA_RWCTRL_READ_BNDRY_64 |
   17169                 :            :                                         DMA_RWCTRL_WRITE_BNDRY_64);
   17170                 :            :                                 break;
   17171                 :            :                         }
   17172                 :            :                         /* fallthrough */
   17173                 :            :                 case 128:
   17174                 :            :                         if (goal == BOUNDARY_SINGLE_CACHELINE) {
   17175                 :            :                                 val |= (DMA_RWCTRL_READ_BNDRY_128 |
   17176                 :            :                                         DMA_RWCTRL_WRITE_BNDRY_128);
   17177                 :            :                                 break;
   17178                 :            :                         }
   17179                 :            :                         /* fallthrough */
   17180                 :            :                 case 256:
   17181                 :            :                         val |= (DMA_RWCTRL_READ_BNDRY_256 |
   17182                 :            :                                 DMA_RWCTRL_WRITE_BNDRY_256);
   17183                 :            :                         break;
   17184                 :            :                 case 512:
   17185                 :            :                         val |= (DMA_RWCTRL_READ_BNDRY_512 |
   17186                 :            :                                 DMA_RWCTRL_WRITE_BNDRY_512);
   17187                 :            :                         break;
   17188                 :            :                 case 1024:
   17189                 :            :                 default:
   17190                 :            :                         val |= (DMA_RWCTRL_READ_BNDRY_1024 |
   17191                 :            :                                 DMA_RWCTRL_WRITE_BNDRY_1024);
   17192                 :            :                         break;
   17193                 :            :                 }
   17194                 :            :         }
   17195                 :            : 
   17196                 :          0 : out:
   17197                 :          0 :         return val;
   17198                 :            : }
   17199                 :            : 
   17200                 :          0 : static int tg3_do_test_dma(struct tg3 *tp, u32 *buf, dma_addr_t buf_dma,
   17201                 :            :                            int size, bool to_device)
   17202                 :            : {
   17203                 :          0 :         struct tg3_internal_buffer_desc test_desc;
   17204                 :          0 :         u32 sram_dma_descs;
   17205                 :          0 :         int i, ret;
   17206                 :            : 
   17207                 :          0 :         sram_dma_descs = NIC_SRAM_DMA_DESC_POOL_BASE;
   17208                 :            : 
   17209                 :          0 :         tw32(FTQ_RCVBD_COMP_FIFO_ENQDEQ, 0);
   17210                 :          0 :         tw32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ, 0);
   17211                 :          0 :         tw32(RDMAC_STATUS, 0);
   17212                 :          0 :         tw32(WDMAC_STATUS, 0);
   17213                 :            : 
   17214                 :          0 :         tw32(BUFMGR_MODE, 0);
   17215                 :          0 :         tw32(FTQ_RESET, 0);
   17216                 :            : 
   17217                 :          0 :         test_desc.addr_hi = ((u64) buf_dma) >> 32;
   17218                 :          0 :         test_desc.addr_lo = buf_dma & 0xffffffff;
   17219                 :          0 :         test_desc.nic_mbuf = 0x00002100;
   17220                 :          0 :         test_desc.len = size;
   17221                 :            : 
   17222                 :            :         /*
   17223                 :            :          * HP ZX1 was seeing test failures for 5701 cards running at 33Mhz
   17224                 :            :          * the *second* time the tg3 driver was getting loaded after an
   17225                 :            :          * initial scan.
   17226                 :            :          *
   17227                 :            :          * Broadcom tells me:
   17228                 :            :          *   ...the DMA engine is connected to the GRC block and a DMA
   17229                 :            :          *   reset may affect the GRC block in some unpredictable way...
   17230                 :            :          *   The behavior of resets to individual blocks has not been tested.
   17231                 :            :          *
   17232                 :            :          * Broadcom noted the GRC reset will also reset all sub-components.
   17233                 :            :          */
   17234         [ #  # ]:          0 :         if (to_device) {
   17235                 :          0 :                 test_desc.cqid_sqid = (13 << 8) | 2;
   17236                 :            : 
   17237                 :          0 :                 tw32_f(RDMAC_MODE, RDMAC_MODE_ENABLE);
   17238                 :          0 :                 udelay(40);
   17239                 :            :         } else {
   17240                 :          0 :                 test_desc.cqid_sqid = (16 << 8) | 7;
   17241                 :            : 
   17242                 :          0 :                 tw32_f(WDMAC_MODE, WDMAC_MODE_ENABLE);
   17243                 :          0 :                 udelay(40);
   17244                 :            :         }
   17245                 :          0 :         test_desc.flags = 0x00000005;
   17246                 :            : 
   17247         [ #  # ]:          0 :         for (i = 0; i < (sizeof(test_desc) / sizeof(u32)); i++) {
   17248                 :          0 :                 u32 val;
   17249                 :            : 
   17250                 :          0 :                 val = *(((u32 *)&test_desc) + i);
   17251                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR,
   17252                 :            :                                        sram_dma_descs + (i * sizeof(u32)));
   17253                 :          0 :                 pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
   17254                 :            :         }
   17255                 :          0 :         pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
   17256                 :            : 
   17257         [ #  # ]:          0 :         if (to_device)
   17258                 :          0 :                 tw32(FTQ_DMA_HIGH_READ_FIFO_ENQDEQ, sram_dma_descs);
   17259                 :            :         else
   17260                 :          0 :                 tw32(FTQ_DMA_HIGH_WRITE_FIFO_ENQDEQ, sram_dma_descs);
   17261                 :            : 
   17262                 :            :         ret = -ENODEV;
   17263         [ #  # ]:          0 :         for (i = 0; i < 40; i++) {
   17264                 :          0 :                 u32 val;
   17265                 :            : 
   17266         [ #  # ]:          0 :                 if (to_device)
   17267                 :          0 :                         val = tr32(FTQ_RCVBD_COMP_FIFO_ENQDEQ);
   17268                 :            :                 else
   17269                 :          0 :                         val = tr32(FTQ_RCVDATA_COMP_FIFO_ENQDEQ);
   17270         [ #  # ]:          0 :                 if ((val & 0xffff) == sram_dma_descs) {
   17271                 :            :                         ret = 0;
   17272                 :            :                         break;
   17273                 :            :                 }
   17274                 :            : 
   17275                 :          0 :                 udelay(100);
   17276                 :            :         }
   17277                 :            : 
   17278                 :          0 :         return ret;
   17279                 :            : }
   17280                 :            : 
   17281                 :            : #define TEST_BUFFER_SIZE        0x2000
   17282                 :            : 
   17283                 :            : static const struct pci_device_id tg3_dma_wait_state_chipsets[] = {
   17284                 :            :         { PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_PCI15) },
   17285                 :            :         { },
   17286                 :            : };
   17287                 :            : 
   17288                 :          0 : static int tg3_test_dma(struct tg3 *tp)
   17289                 :            : {
   17290                 :          0 :         dma_addr_t buf_dma;
   17291                 :          0 :         u32 *buf, saved_dma_rwctrl;
   17292                 :          0 :         int ret = 0;
   17293                 :            : 
   17294                 :          0 :         buf = dma_alloc_coherent(&tp->pdev->dev, TEST_BUFFER_SIZE,
   17295                 :            :                                  &buf_dma, GFP_KERNEL);
   17296         [ #  # ]:          0 :         if (!buf) {
   17297                 :          0 :                 ret = -ENOMEM;
   17298                 :          0 :                 goto out_nofree;
   17299                 :            :         }
   17300                 :            : 
   17301                 :          0 :         tp->dma_rwctrl = ((0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
   17302                 :            :                           (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT));
   17303                 :            : 
   17304                 :          0 :         tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl);
   17305                 :            : 
   17306         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS))
   17307                 :          0 :                 goto out;
   17308                 :            : 
   17309         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS)) {
   17310                 :            :                 /* DMA read watermark not used on PCIE */
   17311                 :          0 :                 tp->dma_rwctrl |= 0x00180000;
   17312         [ #  # ]:          0 :         } else if (!tg3_flag(tp, PCIX_MODE)) {
   17313         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5705 ||
   17314                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5750)
   17315                 :          0 :                         tp->dma_rwctrl |= 0x003f0000;
   17316                 :            :                 else
   17317                 :          0 :                         tp->dma_rwctrl |= 0x003f000f;
   17318                 :            :         } else {
   17319         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5703 ||
   17320                 :            :                     tg3_asic_rev(tp) == ASIC_REV_5704) {
   17321                 :          0 :                         u32 ccval = (tr32(TG3PCI_CLOCK_CTRL) & 0x1f);
   17322                 :          0 :                         u32 read_water = 0x7;
   17323                 :            : 
   17324                 :            :                         /* If the 5704 is behind the EPB bridge, we can
   17325                 :            :                          * do the less restrictive ONE_DMA workaround for
   17326                 :            :                          * better performance.
   17327                 :            :                          */
   17328         [ #  # ]:          0 :                         if (tg3_flag(tp, 40BIT_DMA_BUG) &&
   17329         [ #  # ]:          0 :                             tg3_asic_rev(tp) == ASIC_REV_5704)
   17330                 :          0 :                                 tp->dma_rwctrl |= 0x8000;
   17331         [ #  # ]:          0 :                         else if (ccval == 0x6 || ccval == 0x7)
   17332                 :          0 :                                 tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
   17333                 :            : 
   17334         [ #  # ]:          0 :                         if (tg3_asic_rev(tp) == ASIC_REV_5703)
   17335                 :          0 :                                 read_water = 4;
   17336                 :            :                         /* Set bit 23 to enable PCIX hw bug fix */
   17337                 :          0 :                         tp->dma_rwctrl |=
   17338                 :          0 :                                 (read_water << DMA_RWCTRL_READ_WATER_SHIFT) |
   17339                 :            :                                 (0x3 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
   17340                 :            :                                 (1 << 23);
   17341         [ #  # ]:          0 :                 } else if (tg3_asic_rev(tp) == ASIC_REV_5780) {
   17342                 :            :                         /* 5780 always in PCIX mode */
   17343                 :          0 :                         tp->dma_rwctrl |= 0x00144000;
   17344         [ #  # ]:          0 :                 } else if (tg3_asic_rev(tp) == ASIC_REV_5714) {
   17345                 :            :                         /* 5714 always in PCIX mode */
   17346                 :          0 :                         tp->dma_rwctrl |= 0x00148000;
   17347                 :            :                 } else {
   17348                 :          0 :                         tp->dma_rwctrl |= 0x001b000f;
   17349                 :            :                 }
   17350                 :            :         }
   17351         [ #  # ]:          0 :         if (tg3_flag(tp, ONE_DMA_AT_ONCE))
   17352                 :          0 :                 tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
   17353                 :            : 
   17354         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5703 ||
   17355                 :            :             tg3_asic_rev(tp) == ASIC_REV_5704)
   17356                 :          0 :                 tp->dma_rwctrl &= 0xfffffff0;
   17357                 :            : 
   17358         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5700 ||
   17359                 :            :             tg3_asic_rev(tp) == ASIC_REV_5701) {
   17360                 :            :                 /* Remove this if it causes problems for some boards. */
   17361                 :          0 :                 tp->dma_rwctrl |= DMA_RWCTRL_USE_MEM_READ_MULT;
   17362                 :            : 
   17363                 :            :                 /* On 5700/5701 chips, we need to set this bit.
   17364                 :            :                  * Otherwise the chip will issue cacheline transactions
   17365                 :            :                  * to streamable DMA memory with not all the byte
   17366                 :            :                  * enables turned on.  This is an error on several
   17367                 :            :                  * RISC PCI controllers, in particular sparc64.
   17368                 :            :                  *
   17369                 :            :                  * On 5703/5704 chips, this bit has been reassigned
   17370                 :            :                  * a different meaning.  In particular, it is used
   17371                 :            :                  * on those chips to enable a PCI-X workaround.
   17372                 :            :                  */
   17373                 :          0 :                 tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE;
   17374                 :            :         }
   17375                 :            : 
   17376                 :          0 :         tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
   17377                 :            : 
   17378                 :            : 
   17379         [ #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5700 &&
   17380                 :            :             tg3_asic_rev(tp) != ASIC_REV_5701)
   17381                 :          0 :                 goto out;
   17382                 :            : 
   17383                 :            :         /* It is best to perform DMA test with maximum write burst size
   17384                 :            :          * to expose the 5700/5701 write DMA bug.
   17385                 :            :          */
   17386                 :          0 :         saved_dma_rwctrl = tp->dma_rwctrl;
   17387                 :          0 :         tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
   17388                 :          0 :         tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
   17389                 :            : 
   17390                 :          0 :         while (1) {
   17391                 :          0 :                 u32 *p = buf, i;
   17392                 :            : 
   17393         [ #  # ]:          0 :                 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++)
   17394                 :          0 :                         p[i] = i;
   17395                 :            : 
   17396                 :            :                 /* Send the buffer to the chip. */
   17397                 :          0 :                 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, true);
   17398         [ #  # ]:          0 :                 if (ret) {
   17399                 :          0 :                         dev_err(&tp->pdev->dev,
   17400                 :            :                                 "%s: Buffer write failed. err = %d\n",
   17401                 :            :                                 __func__, ret);
   17402                 :          0 :                         break;
   17403                 :            :                 }
   17404                 :            : 
   17405                 :            :                 /* Now read it back. */
   17406                 :          0 :                 ret = tg3_do_test_dma(tp, buf, buf_dma, TEST_BUFFER_SIZE, false);
   17407         [ #  # ]:          0 :                 if (ret) {
   17408                 :          0 :                         dev_err(&tp->pdev->dev, "%s: Buffer read failed. "
   17409                 :            :                                 "err = %d\n", __func__, ret);
   17410                 :          0 :                         break;
   17411                 :            :                 }
   17412                 :            : 
   17413                 :            :                 /* Verify it. */
   17414         [ #  # ]:          0 :                 for (i = 0; i < TEST_BUFFER_SIZE / sizeof(u32); i++) {
   17415         [ #  # ]:          0 :                         if (p[i] == i)
   17416                 :          0 :                                 continue;
   17417                 :            : 
   17418         [ #  # ]:          0 :                         if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
   17419                 :            :                             DMA_RWCTRL_WRITE_BNDRY_16) {
   17420                 :          0 :                                 tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
   17421                 :          0 :                                 tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
   17422                 :          0 :                                 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
   17423                 :          0 :                                 break;
   17424                 :            :                         } else {
   17425                 :          0 :                                 dev_err(&tp->pdev->dev,
   17426                 :            :                                         "%s: Buffer corrupted on read back! "
   17427                 :            :                                         "(%d != %d)\n", __func__, p[i], i);
   17428                 :          0 :                                 ret = -ENODEV;
   17429                 :          0 :                                 goto out;
   17430                 :            :                         }
   17431                 :            :                 }
   17432                 :            : 
   17433         [ #  # ]:          0 :                 if (i == (TEST_BUFFER_SIZE / sizeof(u32))) {
   17434                 :            :                         /* Success. */
   17435                 :            :                         ret = 0;
   17436                 :            :                         break;
   17437                 :            :                 }
   17438                 :            :         }
   17439         [ #  # ]:          0 :         if ((tp->dma_rwctrl & DMA_RWCTRL_WRITE_BNDRY_MASK) !=
   17440                 :            :             DMA_RWCTRL_WRITE_BNDRY_16) {
   17441                 :            :                 /* DMA test passed without adjusting DMA boundary,
   17442                 :            :                  * now look for chipsets that are known to expose the
   17443                 :            :                  * DMA bug without failing the test.
   17444                 :            :                  */
   17445         [ #  # ]:          0 :                 if (pci_dev_present(tg3_dma_wait_state_chipsets)) {
   17446                 :          0 :                         tp->dma_rwctrl &= ~DMA_RWCTRL_WRITE_BNDRY_MASK;
   17447                 :          0 :                         tp->dma_rwctrl |= DMA_RWCTRL_WRITE_BNDRY_16;
   17448                 :            :                 } else {
   17449                 :            :                         /* Safe to use the calculated DMA boundary. */
   17450                 :          0 :                         tp->dma_rwctrl = saved_dma_rwctrl;
   17451                 :            :                 }
   17452                 :            : 
   17453                 :          0 :                 tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
   17454                 :            :         }
   17455                 :            : 
   17456                 :          0 : out:
   17457                 :          0 :         dma_free_coherent(&tp->pdev->dev, TEST_BUFFER_SIZE, buf, buf_dma);
   17458                 :          0 : out_nofree:
   17459                 :          0 :         return ret;
   17460                 :            : }
   17461                 :            : 
   17462                 :          0 : static void tg3_init_bufmgr_config(struct tg3 *tp)
   17463                 :            : {
   17464         [ #  # ]:          0 :         if (tg3_flag(tp, 57765_PLUS)) {
   17465                 :          0 :                 tp->bufmgr_config.mbuf_read_dma_low_water =
   17466                 :            :                         DEFAULT_MB_RDMA_LOW_WATER_5705;
   17467                 :          0 :                 tp->bufmgr_config.mbuf_mac_rx_low_water =
   17468                 :            :                         DEFAULT_MB_MACRX_LOW_WATER_57765;
   17469                 :          0 :                 tp->bufmgr_config.mbuf_high_water =
   17470                 :            :                         DEFAULT_MB_HIGH_WATER_57765;
   17471                 :            : 
   17472                 :          0 :                 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
   17473                 :            :                         DEFAULT_MB_RDMA_LOW_WATER_5705;
   17474                 :          0 :                 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
   17475                 :            :                         DEFAULT_MB_MACRX_LOW_WATER_JUMBO_57765;
   17476                 :          0 :                 tp->bufmgr_config.mbuf_high_water_jumbo =
   17477                 :            :                         DEFAULT_MB_HIGH_WATER_JUMBO_57765;
   17478         [ #  # ]:          0 :         } else if (tg3_flag(tp, 5705_PLUS)) {
   17479                 :          0 :                 tp->bufmgr_config.mbuf_read_dma_low_water =
   17480                 :            :                         DEFAULT_MB_RDMA_LOW_WATER_5705;
   17481                 :          0 :                 tp->bufmgr_config.mbuf_mac_rx_low_water =
   17482                 :            :                         DEFAULT_MB_MACRX_LOW_WATER_5705;
   17483                 :          0 :                 tp->bufmgr_config.mbuf_high_water =
   17484                 :            :                         DEFAULT_MB_HIGH_WATER_5705;
   17485         [ #  # ]:          0 :                 if (tg3_asic_rev(tp) == ASIC_REV_5906) {
   17486                 :          0 :                         tp->bufmgr_config.mbuf_mac_rx_low_water =
   17487                 :            :                                 DEFAULT_MB_MACRX_LOW_WATER_5906;
   17488                 :          0 :                         tp->bufmgr_config.mbuf_high_water =
   17489                 :            :                                 DEFAULT_MB_HIGH_WATER_5906;
   17490                 :            :                 }
   17491                 :            : 
   17492                 :          0 :                 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
   17493                 :            :                         DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780;
   17494                 :          0 :                 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
   17495                 :            :                         DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780;
   17496                 :          0 :                 tp->bufmgr_config.mbuf_high_water_jumbo =
   17497                 :            :                         DEFAULT_MB_HIGH_WATER_JUMBO_5780;
   17498                 :            :         } else {
   17499                 :          0 :                 tp->bufmgr_config.mbuf_read_dma_low_water =
   17500                 :            :                         DEFAULT_MB_RDMA_LOW_WATER;
   17501                 :          0 :                 tp->bufmgr_config.mbuf_mac_rx_low_water =
   17502                 :            :                         DEFAULT_MB_MACRX_LOW_WATER;
   17503                 :          0 :                 tp->bufmgr_config.mbuf_high_water =
   17504                 :            :                         DEFAULT_MB_HIGH_WATER;
   17505                 :            : 
   17506                 :          0 :                 tp->bufmgr_config.mbuf_read_dma_low_water_jumbo =
   17507                 :            :                         DEFAULT_MB_RDMA_LOW_WATER_JUMBO;
   17508                 :          0 :                 tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo =
   17509                 :            :                         DEFAULT_MB_MACRX_LOW_WATER_JUMBO;
   17510                 :          0 :                 tp->bufmgr_config.mbuf_high_water_jumbo =
   17511                 :            :                         DEFAULT_MB_HIGH_WATER_JUMBO;
   17512                 :            :         }
   17513                 :            : 
   17514                 :          0 :         tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER;
   17515                 :          0 :         tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER;
   17516                 :          0 : }
   17517                 :            : 
   17518                 :            : static char *tg3_phy_string(struct tg3 *tp)
   17519                 :            : {
   17520                 :            :         switch (tp->phy_id & TG3_PHY_ID_MASK) {
   17521                 :            :         case TG3_PHY_ID_BCM5400:        return "5400";
   17522                 :            :         case TG3_PHY_ID_BCM5401:        return "5401";
   17523                 :            :         case TG3_PHY_ID_BCM5411:        return "5411";
   17524                 :            :         case TG3_PHY_ID_BCM5701:        return "5701";
   17525                 :            :         case TG3_PHY_ID_BCM5703:        return "5703";
   17526                 :            :         case TG3_PHY_ID_BCM5704:        return "5704";
   17527                 :            :         case TG3_PHY_ID_BCM5705:        return "5705";
   17528                 :            :         case TG3_PHY_ID_BCM5750:        return "5750";
   17529                 :            :         case TG3_PHY_ID_BCM5752:        return "5752";
   17530                 :            :         case TG3_PHY_ID_BCM5714:        return "5714";
   17531                 :            :         case TG3_PHY_ID_BCM5780:        return "5780";
   17532                 :            :         case TG3_PHY_ID_BCM5755:        return "5755";
   17533                 :            :         case TG3_PHY_ID_BCM5787:        return "5787";
   17534                 :            :         case TG3_PHY_ID_BCM5784:        return "5784";
   17535                 :            :         case TG3_PHY_ID_BCM5756:        return "5722/5756";
   17536                 :            :         case TG3_PHY_ID_BCM5906:        return "5906";
   17537                 :            :         case TG3_PHY_ID_BCM5761:        return "5761";
   17538                 :            :         case TG3_PHY_ID_BCM5718C:       return "5718C";
   17539                 :            :         case TG3_PHY_ID_BCM5718S:       return "5718S";
   17540                 :            :         case TG3_PHY_ID_BCM57765:       return "57765";
   17541                 :            :         case TG3_PHY_ID_BCM5719C:       return "5719C";
   17542                 :            :         case TG3_PHY_ID_BCM5720C:       return "5720C";
   17543                 :            :         case TG3_PHY_ID_BCM5762:        return "5762C";
   17544                 :            :         case TG3_PHY_ID_BCM8002:        return "8002/serdes";
   17545                 :            :         case 0:                 return "serdes";
   17546                 :            :         default:                return "unknown";
   17547                 :            :         }
   17548                 :            : }
   17549                 :            : 
   17550                 :          0 : static char *tg3_bus_string(struct tg3 *tp, char *str)
   17551                 :            : {
   17552         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_EXPRESS)) {
   17553                 :          0 :                 strcpy(str, "PCI Express");
   17554                 :          0 :                 return str;
   17555         [ #  # ]:          0 :         } else if (tg3_flag(tp, PCIX_MODE)) {
   17556                 :          0 :                 u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL) & 0x1f;
   17557                 :            : 
   17558                 :          0 :                 strcpy(str, "PCIX:");
   17559                 :            : 
   17560         [ #  # ]:          0 :                 if ((clock_ctrl == 7) ||
   17561         [ #  # ]:          0 :                     ((tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK) ==
   17562                 :            :                      GRC_MISC_CFG_BOARD_ID_5704CIOBE))
   17563                 :          0 :                         strcat(str, "133MHz");
   17564         [ #  # ]:          0 :                 else if (clock_ctrl == 0)
   17565                 :          0 :                         strcat(str, "33MHz");
   17566         [ #  # ]:          0 :                 else if (clock_ctrl == 2)
   17567                 :          0 :                         strcat(str, "50MHz");
   17568         [ #  # ]:          0 :                 else if (clock_ctrl == 4)
   17569                 :          0 :                         strcat(str, "66MHz");
   17570         [ #  # ]:          0 :                 else if (clock_ctrl == 6)
   17571                 :          0 :                         strcat(str, "100MHz");
   17572                 :            :         } else {
   17573                 :          0 :                 strcpy(str, "PCI:");
   17574         [ #  # ]:          0 :                 if (tg3_flag(tp, PCI_HIGH_SPEED))
   17575                 :          0 :                         strcat(str, "66MHz");
   17576                 :            :                 else
   17577                 :          0 :                         strcat(str, "33MHz");
   17578                 :            :         }
   17579         [ #  # ]:          0 :         if (tg3_flag(tp, PCI_32BIT))
   17580                 :          0 :                 strcat(str, ":32-bit");
   17581                 :            :         else
   17582                 :          0 :                 strcat(str, ":64-bit");
   17583                 :            :         return str;
   17584                 :            : }
   17585                 :            : 
   17586                 :          0 : static void tg3_init_coal(struct tg3 *tp)
   17587                 :            : {
   17588                 :          0 :         struct ethtool_coalesce *ec = &tp->coal;
   17589                 :            : 
   17590                 :          0 :         memset(ec, 0, sizeof(*ec));
   17591                 :          0 :         ec->cmd = ETHTOOL_GCOALESCE;
   17592                 :          0 :         ec->rx_coalesce_usecs = LOW_RXCOL_TICKS;
   17593                 :          0 :         ec->tx_coalesce_usecs = LOW_TXCOL_TICKS;
   17594                 :          0 :         ec->rx_max_coalesced_frames = LOW_RXMAX_FRAMES;
   17595                 :          0 :         ec->tx_max_coalesced_frames = LOW_TXMAX_FRAMES;
   17596                 :          0 :         ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT;
   17597                 :          0 :         ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT;
   17598                 :          0 :         ec->rx_max_coalesced_frames_irq = DEFAULT_RXCOAL_MAXF_INT;
   17599                 :          0 :         ec->tx_max_coalesced_frames_irq = DEFAULT_TXCOAL_MAXF_INT;
   17600                 :          0 :         ec->stats_block_coalesce_usecs = DEFAULT_STAT_COAL_TICKS;
   17601                 :            : 
   17602         [ #  # ]:          0 :         if (tp->coalesce_mode & (HOSTCC_MODE_CLRTICK_RXBD |
   17603                 :            :                                  HOSTCC_MODE_CLRTICK_TXBD)) {
   17604                 :          0 :                 ec->rx_coalesce_usecs = LOW_RXCOL_TICKS_CLRTCKS;
   17605                 :          0 :                 ec->rx_coalesce_usecs_irq = DEFAULT_RXCOAL_TICK_INT_CLRTCKS;
   17606                 :          0 :                 ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS;
   17607                 :          0 :                 ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS;
   17608                 :            :         }
   17609                 :            : 
   17610         [ #  # ]:          0 :         if (tg3_flag(tp, 5705_PLUS)) {
   17611                 :          0 :                 ec->rx_coalesce_usecs_irq = 0;
   17612                 :          0 :                 ec->tx_coalesce_usecs_irq = 0;
   17613                 :          0 :                 ec->stats_block_coalesce_usecs = 0;
   17614                 :            :         }
   17615                 :          0 : }
   17616                 :            : 
   17617                 :          0 : static int tg3_init_one(struct pci_dev *pdev,
   17618                 :            :                                   const struct pci_device_id *ent)
   17619                 :            : {
   17620                 :          0 :         struct net_device *dev;
   17621                 :          0 :         struct tg3 *tp;
   17622                 :          0 :         int i, err;
   17623                 :          0 :         u32 sndmbx, rcvmbx, intmbx;
   17624                 :          0 :         char str[40];
   17625                 :          0 :         u64 dma_mask, persist_dma_mask;
   17626                 :          0 :         netdev_features_t features = 0;
   17627                 :            : 
   17628         [ #  # ]:          0 :         printk_once(KERN_INFO "%s\n", version);
   17629                 :            : 
   17630                 :          0 :         err = pci_enable_device(pdev);
   17631         [ #  # ]:          0 :         if (err) {
   17632                 :          0 :                 dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
   17633                 :          0 :                 return err;
   17634                 :            :         }
   17635                 :            : 
   17636                 :          0 :         err = pci_request_regions(pdev, DRV_MODULE_NAME);
   17637         [ #  # ]:          0 :         if (err) {
   17638                 :          0 :                 dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting\n");
   17639                 :          0 :                 goto err_out_disable_pdev;
   17640                 :            :         }
   17641                 :            : 
   17642                 :          0 :         pci_set_master(pdev);
   17643                 :            : 
   17644                 :          0 :         dev = alloc_etherdev_mq(sizeof(*tp), TG3_IRQ_MAX_VECS);
   17645         [ #  # ]:          0 :         if (!dev) {
   17646                 :          0 :                 err = -ENOMEM;
   17647                 :          0 :                 goto err_out_free_res;
   17648                 :            :         }
   17649                 :            : 
   17650                 :          0 :         SET_NETDEV_DEV(dev, &pdev->dev);
   17651                 :            : 
   17652         [ #  # ]:          0 :         tp = netdev_priv(dev);
   17653                 :          0 :         tp->pdev = pdev;
   17654                 :          0 :         tp->dev = dev;
   17655                 :          0 :         tp->rx_mode = TG3_DEF_RX_MODE;
   17656                 :          0 :         tp->tx_mode = TG3_DEF_TX_MODE;
   17657                 :          0 :         tp->irq_sync = 1;
   17658                 :          0 :         tp->pcierr_recovery = false;
   17659                 :            : 
   17660         [ #  # ]:          0 :         if (tg3_debug > 0)
   17661                 :          0 :                 tp->msg_enable = tg3_debug;
   17662                 :            :         else
   17663                 :          0 :                 tp->msg_enable = TG3_DEF_MSG_ENABLE;
   17664                 :            : 
   17665                 :          0 :         if (pdev_is_ssb_gige_core(pdev)) {
   17666                 :            :                 tg3_flag_set(tp, IS_SSB_CORE);
   17667                 :            :                 if (ssb_gige_must_flush_posted_writes(pdev))
   17668                 :            :                         tg3_flag_set(tp, FLUSH_POSTED_WRITES);
   17669                 :            :                 if (ssb_gige_one_dma_at_once(pdev))
   17670                 :            :                         tg3_flag_set(tp, ONE_DMA_AT_ONCE);
   17671                 :            :                 if (ssb_gige_have_roboswitch(pdev)) {
   17672                 :            :                         tg3_flag_set(tp, USE_PHYLIB);
   17673                 :            :                         tg3_flag_set(tp, ROBOSWITCH);
   17674                 :            :                 }
   17675                 :            :                 if (ssb_gige_is_rgmii(pdev))
   17676                 :            :                         tg3_flag_set(tp, RGMII_MODE);
   17677                 :            :         }
   17678                 :            : 
   17679                 :            :         /* The word/byte swap controls here control register access byte
   17680                 :            :          * swapping.  DMA data byte swapping is controlled in the GRC_MODE
   17681                 :            :          * setting below.
   17682                 :            :          */
   17683                 :          0 :         tp->misc_host_ctrl =
   17684                 :            :                 MISC_HOST_CTRL_MASK_PCI_INT |
   17685                 :            :                 MISC_HOST_CTRL_WORD_SWAP |
   17686                 :            :                 MISC_HOST_CTRL_INDIR_ACCESS |
   17687                 :            :                 MISC_HOST_CTRL_PCISTATE_RW;
   17688                 :            : 
   17689                 :            :         /* The NONFRM (non-frame) byte/word swap controls take effect
   17690                 :            :          * on descriptor entries, anything which isn't packet data.
   17691                 :            :          *
   17692                 :            :          * The StrongARM chips on the board (one for tx, one for rx)
   17693                 :            :          * are running in big-endian mode.
   17694                 :            :          */
   17695                 :          0 :         tp->grc_mode = (GRC_MODE_WSWAP_DATA | GRC_MODE_BSWAP_DATA |
   17696                 :            :                         GRC_MODE_WSWAP_NONFRM_DATA);
   17697                 :            : #ifdef __BIG_ENDIAN
   17698                 :            :         tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA;
   17699                 :            : #endif
   17700                 :          0 :         spin_lock_init(&tp->lock);
   17701                 :          0 :         spin_lock_init(&tp->indirect_lock);
   17702                 :          0 :         INIT_WORK(&tp->reset_task, tg3_reset_task);
   17703                 :            : 
   17704                 :          0 :         tp->regs = pci_ioremap_bar(pdev, BAR_0);
   17705         [ #  # ]:          0 :         if (!tp->regs) {
   17706                 :          0 :                 dev_err(&pdev->dev, "Cannot map device registers, aborting\n");
   17707                 :          0 :                 err = -ENOMEM;
   17708                 :          0 :                 goto err_out_free_dev;
   17709                 :            :         }
   17710                 :            : 
   17711                 :          0 :         if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 ||
   17712         [ #  # ]:          0 :             tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761E ||
   17713         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S ||
   17714         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761SE ||
   17715         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 ||
   17716         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717_C ||
   17717         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||
   17718         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||
   17719         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720 ||
   17720         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_57767 ||
   17721         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_57764 ||
   17722         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5762 ||
   17723         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5725 ||
   17724         [ #  # ]:          0 :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_5727 ||
   17725                 :            :             tp->pdev->device == TG3PCI_DEVICE_TIGON3_57787) {
   17726                 :          0 :                 tg3_flag_set(tp, ENABLE_APE);
   17727                 :          0 :                 tp->aperegs = pci_ioremap_bar(pdev, BAR_2);
   17728         [ #  # ]:          0 :                 if (!tp->aperegs) {
   17729                 :          0 :                         dev_err(&pdev->dev,
   17730                 :            :                                 "Cannot map APE registers, aborting\n");
   17731                 :          0 :                         err = -ENOMEM;
   17732                 :          0 :                         goto err_out_iounmap;
   17733                 :            :                 }
   17734                 :            :         }
   17735                 :            : 
   17736                 :          0 :         tp->rx_pending = TG3_DEF_RX_RING_PENDING;
   17737                 :          0 :         tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING;
   17738                 :            : 
   17739                 :          0 :         dev->ethtool_ops = &tg3_ethtool_ops;
   17740                 :          0 :         dev->watchdog_timeo = TG3_TX_TIMEOUT;
   17741                 :          0 :         dev->netdev_ops = &tg3_netdev_ops;
   17742                 :          0 :         dev->irq = pdev->irq;
   17743                 :            : 
   17744                 :          0 :         err = tg3_get_invariants(tp, ent);
   17745         [ #  # ]:          0 :         if (err) {
   17746                 :          0 :                 dev_err(&pdev->dev,
   17747                 :            :                         "Problem fetching invariants of chip, aborting\n");
   17748                 :          0 :                 goto err_out_apeunmap;
   17749                 :            :         }
   17750                 :            : 
   17751                 :            :         /* The EPB bridge inside 5714, 5715, and 5780 and any
   17752                 :            :          * device behind the EPB cannot support DMA addresses > 40-bit.
   17753                 :            :          * On 64-bit systems with IOMMU, use 40-bit dma_mask.
   17754                 :            :          * On 64-bit systems without IOMMU, use 64-bit dma_mask and
   17755                 :            :          * do DMA address check in tg3_start_xmit().
   17756                 :            :          */
   17757         [ #  # ]:          0 :         if (tg3_flag(tp, IS_5788))
   17758                 :            :                 persist_dma_mask = dma_mask = DMA_BIT_MASK(32);
   17759         [ #  # ]:          0 :         else if (tg3_flag(tp, 40BIT_DMA_BUG)) {
   17760                 :            :                 persist_dma_mask = dma_mask = DMA_BIT_MASK(40);
   17761                 :            : #ifdef CONFIG_HIGHMEM
   17762                 :            :                 dma_mask = DMA_BIT_MASK(64);
   17763                 :            : #endif
   17764                 :            :         } else
   17765                 :            :                 persist_dma_mask = dma_mask = DMA_BIT_MASK(64);
   17766                 :            : 
   17767                 :            :         /* Configure DMA attributes. */
   17768                 :            :         if (dma_mask > DMA_BIT_MASK(32)) {
   17769                 :          0 :                 err = pci_set_dma_mask(pdev, dma_mask);
   17770         [ #  # ]:          0 :                 if (!err) {
   17771                 :          0 :                         features |= NETIF_F_HIGHDMA;
   17772                 :          0 :                         err = pci_set_consistent_dma_mask(pdev,
   17773                 :            :                                                           persist_dma_mask);
   17774         [ #  # ]:          0 :                         if (err < 0) {
   17775                 :          0 :                                 dev_err(&pdev->dev, "Unable to obtain 64 bit "
   17776                 :            :                                         "DMA for consistent allocations\n");
   17777                 :          0 :                                 goto err_out_apeunmap;
   17778                 :            :                         }
   17779                 :            :                 }
   17780                 :            :         }
   17781         [ #  # ]:          0 :         if (err || dma_mask == DMA_BIT_MASK(32)) {
   17782                 :          0 :                 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
   17783         [ #  # ]:          0 :                 if (err) {
   17784                 :          0 :                         dev_err(&pdev->dev,
   17785                 :            :                                 "No usable DMA configuration, aborting\n");
   17786                 :          0 :                         goto err_out_apeunmap;
   17787                 :            :                 }
   17788                 :            :         }
   17789                 :            : 
   17790                 :          0 :         tg3_init_bufmgr_config(tp);
   17791                 :            : 
   17792                 :            :         /* 5700 B0 chips do not support checksumming correctly due
   17793                 :            :          * to hardware bugs.
   17794                 :            :          */
   17795         [ #  # ]:          0 :         if (tg3_chip_rev_id(tp) != CHIPREV_ID_5700_B0) {
   17796                 :          0 :                 features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
   17797                 :            : 
   17798         [ #  # ]:          0 :                 if (tg3_flag(tp, 5755_PLUS))
   17799                 :          0 :                         features |= NETIF_F_IPV6_CSUM;
   17800                 :            :         }
   17801                 :            : 
   17802                 :            :         /* TSO is on by default on chips that support hardware TSO.
   17803                 :            :          * Firmware TSO on older chips gives lower performance, so it
   17804                 :            :          * is off by default, but can be enabled using ethtool.
   17805                 :            :          */
   17806   [ #  #  #  # ]:          0 :         if ((tg3_flag(tp, HW_TSO_1) ||
   17807         [ #  # ]:          0 :              tg3_flag(tp, HW_TSO_2) ||
   17808                 :          0 :              tg3_flag(tp, HW_TSO_3)) &&
   17809         [ #  # ]:          0 :             (features & NETIF_F_IP_CSUM))
   17810                 :          0 :                 features |= NETIF_F_TSO;
   17811   [ #  #  #  # ]:          0 :         if (tg3_flag(tp, HW_TSO_2) || tg3_flag(tp, HW_TSO_3)) {
   17812         [ #  # ]:          0 :                 if (features & NETIF_F_IPV6_CSUM)
   17813                 :          0 :                         features |= NETIF_F_TSO6;
   17814         [ #  # ]:          0 :                 if (tg3_flag(tp, HW_TSO_3) ||
   17815   [ #  #  #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5761 ||
   17816                 :          0 :                     (tg3_asic_rev(tp) == ASIC_REV_5784 &&
   17817   [ #  #  #  # ]:          0 :                      tg3_chip_rev(tp) != CHIPREV_5784_AX) ||
   17818         [ #  # ]:          0 :                     tg3_asic_rev(tp) == ASIC_REV_5785 ||
   17819                 :            :                     tg3_asic_rev(tp) == ASIC_REV_57780)
   17820                 :          0 :                         features |= NETIF_F_TSO_ECN;
   17821                 :            :         }
   17822                 :            : 
   17823                 :          0 :         dev->features |= features | NETIF_F_HW_VLAN_CTAG_TX |
   17824                 :            :                          NETIF_F_HW_VLAN_CTAG_RX;
   17825                 :          0 :         dev->vlan_features |= features;
   17826                 :            : 
   17827                 :            :         /*
   17828                 :            :          * Add loopback capability only for a subset of devices that support
   17829                 :            :          * MAC-LOOPBACK. Eventually this need to be enhanced to allow INT-PHY
   17830                 :            :          * loopback for the remaining devices.
   17831                 :            :          */
   17832   [ #  #  #  # ]:          0 :         if (tg3_asic_rev(tp) != ASIC_REV_5780 &&
   17833                 :            :             !tg3_flag(tp, CPMU_PRESENT))
   17834                 :            :                 /* Add the loopback capability */
   17835                 :          0 :                 features |= NETIF_F_LOOPBACK;
   17836                 :            : 
   17837                 :          0 :         dev->hw_features |= features;
   17838                 :          0 :         dev->priv_flags |= IFF_UNICAST_FLT;
   17839                 :            : 
   17840                 :            :         /* MTU range: 60 - 9000 or 1500, depending on hardware */
   17841                 :          0 :         dev->min_mtu = TG3_MIN_MTU;
   17842         [ #  # ]:          0 :         dev->max_mtu = TG3_MAX_MTU(tp);
   17843                 :            : 
   17844   [ #  #  #  # ]:          0 :         if (tg3_chip_rev_id(tp) == CHIPREV_ID_5705_A1 &&
   17845                 :          0 :             !tg3_flag(tp, TSO_CAPABLE) &&
   17846         [ #  # ]:          0 :             !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) {
   17847                 :          0 :                 tg3_flag_set(tp, MAX_RXPEND_64);
   17848                 :          0 :                 tp->rx_pending = 63;
   17849                 :            :         }
   17850                 :            : 
   17851                 :          0 :         err = tg3_get_device_address(tp);
   17852         [ #  # ]:          0 :         if (err) {
   17853                 :          0 :                 dev_err(&pdev->dev,
   17854                 :            :                         "Could not obtain valid ethernet address, aborting\n");
   17855                 :          0 :                 goto err_out_apeunmap;
   17856                 :            :         }
   17857                 :            : 
   17858                 :            :         intmbx = MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW;
   17859                 :            :         rcvmbx = MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW;
   17860                 :            :         sndmbx = MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW;
   17861         [ #  # ]:          0 :         for (i = 0; i < tp->irq_max; i++) {
   17862                 :          0 :                 struct tg3_napi *tnapi = &tp->napi[i];
   17863                 :            : 
   17864                 :          0 :                 tnapi->tp = tp;
   17865                 :          0 :                 tnapi->tx_pending = TG3_DEF_TX_RING_PENDING;
   17866                 :            : 
   17867                 :          0 :                 tnapi->int_mbox = intmbx;
   17868         [ #  # ]:          0 :                 if (i <= 4)
   17869                 :          0 :                         intmbx += 0x8;
   17870                 :            :                 else
   17871                 :          0 :                         intmbx += 0x4;
   17872                 :            : 
   17873                 :          0 :                 tnapi->consmbox = rcvmbx;
   17874                 :          0 :                 tnapi->prodmbox = sndmbx;
   17875                 :            : 
   17876         [ #  # ]:          0 :                 if (i)
   17877                 :          0 :                         tnapi->coal_now = HOSTCC_MODE_COAL_VEC1_NOW << (i - 1);
   17878                 :            :                 else
   17879                 :          0 :                         tnapi->coal_now = HOSTCC_MODE_NOW;
   17880                 :            : 
   17881         [ #  # ]:          0 :                 if (!tg3_flag(tp, SUPPORT_MSIX))
   17882                 :            :                         break;
   17883                 :            : 
   17884                 :            :                 /*
   17885                 :            :                  * If we support MSIX, we'll be using RSS.  If we're using
   17886                 :            :                  * RSS, the first vector only handles link interrupts and the
   17887                 :            :                  * remaining vectors handle rx and tx interrupts.  Reuse the
   17888                 :            :                  * mailbox values for the next iteration.  The values we setup
   17889                 :            :                  * above are still useful for the single vectored mode.
   17890                 :            :                  */
   17891         [ #  # ]:          0 :                 if (!i)
   17892                 :          0 :                         continue;
   17893                 :            : 
   17894                 :          0 :                 rcvmbx += 0x8;
   17895                 :            : 
   17896         [ #  # ]:          0 :                 if (sndmbx & 0x4)
   17897                 :          0 :                         sndmbx -= 0x4;
   17898                 :            :                 else
   17899                 :          0 :                         sndmbx += 0xc;
   17900                 :            :         }
   17901                 :            : 
   17902                 :            :         /*
   17903                 :            :          * Reset chip in case UNDI or EFI driver did not shutdown
   17904                 :            :          * DMA self test will enable WDMAC and we'll see (spurious)
   17905                 :            :          * pending DMA on the PCI bus at that point.
   17906                 :            :          */
   17907         [ #  # ]:          0 :         if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) ||
   17908         [ #  # ]:          0 :             (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) {
   17909                 :          0 :                 tg3_full_lock(tp, 0);
   17910                 :          0 :                 tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
   17911                 :          0 :                 tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   17912                 :          0 :                 tg3_full_unlock(tp);
   17913                 :            :         }
   17914                 :            : 
   17915                 :          0 :         err = tg3_test_dma(tp);
   17916         [ #  # ]:          0 :         if (err) {
   17917                 :          0 :                 dev_err(&pdev->dev, "DMA engine test failed, aborting\n");
   17918                 :          0 :                 goto err_out_apeunmap;
   17919                 :            :         }
   17920                 :            : 
   17921                 :          0 :         tg3_init_coal(tp);
   17922                 :            : 
   17923         [ #  # ]:          0 :         pci_set_drvdata(pdev, dev);
   17924                 :            : 
   17925         [ #  # ]:          0 :         if (tg3_asic_rev(tp) == ASIC_REV_5719 ||
   17926         [ #  # ]:          0 :             tg3_asic_rev(tp) == ASIC_REV_5720 ||
   17927                 :            :             tg3_asic_rev(tp) == ASIC_REV_5762)
   17928                 :          0 :                 tg3_flag_set(tp, PTP_CAPABLE);
   17929                 :            : 
   17930                 :          0 :         tg3_timer_init(tp);
   17931                 :            : 
   17932                 :          0 :         tg3_carrier_off(tp);
   17933                 :            : 
   17934                 :          0 :         err = register_netdev(dev);
   17935         [ #  # ]:          0 :         if (err) {
   17936                 :          0 :                 dev_err(&pdev->dev, "Cannot register net device, aborting\n");
   17937                 :          0 :                 goto err_out_apeunmap;
   17938                 :            :         }
   17939                 :            : 
   17940         [ #  # ]:          0 :         if (tg3_flag(tp, PTP_CAPABLE)) {
   17941                 :          0 :                 tg3_ptp_init(tp);
   17942                 :          0 :                 tp->ptp_clock = ptp_clock_register(&tp->ptp_info,
   17943                 :          0 :                                                    &tp->pdev->dev);
   17944         [ #  # ]:          0 :                 if (IS_ERR(tp->ptp_clock))
   17945                 :          0 :                         tp->ptp_clock = NULL;
   17946                 :            :         }
   17947                 :            : 
   17948                 :          0 :         netdev_info(dev, "Tigon3 [partno(%s) rev %04x] (%s) MAC address %pM\n",
   17949                 :          0 :                     tp->board_part_number,
   17950                 :            :                     tg3_chip_rev_id(tp),
   17951                 :            :                     tg3_bus_string(tp, str),
   17952                 :            :                     dev->dev_addr);
   17953                 :            : 
   17954         [ #  # ]:          0 :         if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) {
   17955                 :          0 :                 char *ethtype;
   17956                 :            : 
   17957         [ #  # ]:          0 :                 if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
   17958                 :            :                         ethtype = "10/100Base-TX";
   17959         [ #  # ]:          0 :                 else if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
   17960                 :            :                         ethtype = "1000Base-SX";
   17961                 :            :                 else
   17962                 :          0 :                         ethtype = "10/100/1000Base-T";
   17963                 :            : 
   17964                 :          0 :                 netdev_info(dev, "attached PHY is %s (%s Ethernet) "
   17965                 :            :                             "(WireSpeed[%d], EEE[%d])\n",
   17966                 :            :                             tg3_phy_string(tp), ethtype,
   17967                 :          0 :                             (tp->phy_flags & TG3_PHYFLG_NO_ETH_WIRE_SPEED) == 0,
   17968                 :          0 :                             (tp->phy_flags & TG3_PHYFLG_EEE_CAP) != 0);
   17969                 :            :         }
   17970                 :            : 
   17971                 :          0 :         netdev_info(dev, "RXcsums[%d] LinkChgREG[%d] MIirq[%d] ASF[%d] TSOcap[%d]\n",
   17972                 :          0 :                     (dev->features & NETIF_F_RXCSUM) != 0,
   17973                 :            :                     tg3_flag(tp, USE_LINKCHG_REG) != 0,
   17974                 :          0 :                     (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT) != 0,
   17975                 :            :                     tg3_flag(tp, ENABLE_ASF) != 0,
   17976                 :            :                     tg3_flag(tp, TSO_CAPABLE) != 0);
   17977                 :          0 :         netdev_info(dev, "dma_rwctrl[%08x] dma_mask[%d-bit]\n",
   17978                 :            :                     tp->dma_rwctrl,
   17979         [ #  # ]:          0 :                     pdev->dma_mask == DMA_BIT_MASK(32) ? 32 :
   17980         [ #  # ]:          0 :                     ((u64)pdev->dma_mask) == DMA_BIT_MASK(40) ? 40 : 64);
   17981                 :            : 
   17982                 :          0 :         pci_save_state(pdev);
   17983                 :            : 
   17984                 :          0 :         return 0;
   17985                 :            : 
   17986                 :          0 : err_out_apeunmap:
   17987         [ #  # ]:          0 :         if (tp->aperegs) {
   17988                 :          0 :                 iounmap(tp->aperegs);
   17989                 :          0 :                 tp->aperegs = NULL;
   17990                 :            :         }
   17991                 :            : 
   17992                 :          0 : err_out_iounmap:
   17993         [ #  # ]:          0 :         if (tp->regs) {
   17994                 :          0 :                 iounmap(tp->regs);
   17995                 :          0 :                 tp->regs = NULL;
   17996                 :            :         }
   17997                 :            : 
   17998                 :          0 : err_out_free_dev:
   17999                 :          0 :         free_netdev(dev);
   18000                 :            : 
   18001                 :          0 : err_out_free_res:
   18002                 :          0 :         pci_release_regions(pdev);
   18003                 :            : 
   18004                 :          0 : err_out_disable_pdev:
   18005         [ #  # ]:          0 :         if (pci_is_enabled(pdev))
   18006                 :          0 :                 pci_disable_device(pdev);
   18007                 :            :         return err;
   18008                 :            : }
   18009                 :            : 
   18010                 :          0 : static void tg3_remove_one(struct pci_dev *pdev)
   18011                 :            : {
   18012         [ #  # ]:          0 :         struct net_device *dev = pci_get_drvdata(pdev);
   18013                 :            : 
   18014         [ #  # ]:          0 :         if (dev) {
   18015                 :          0 :                 struct tg3 *tp = netdev_priv(dev);
   18016                 :            : 
   18017                 :          0 :                 tg3_ptp_fini(tp);
   18018                 :            : 
   18019                 :          0 :                 release_firmware(tp->fw);
   18020                 :            : 
   18021                 :          0 :                 tg3_reset_task_cancel(tp);
   18022                 :            : 
   18023         [ #  # ]:          0 :                 if (tg3_flag(tp, USE_PHYLIB)) {
   18024                 :          0 :                         tg3_phy_fini(tp);
   18025                 :          0 :                         tg3_mdio_fini(tp);
   18026                 :            :                 }
   18027                 :            : 
   18028                 :          0 :                 unregister_netdev(dev);
   18029         [ #  # ]:          0 :                 if (tp->aperegs) {
   18030                 :          0 :                         iounmap(tp->aperegs);
   18031                 :          0 :                         tp->aperegs = NULL;
   18032                 :            :                 }
   18033         [ #  # ]:          0 :                 if (tp->regs) {
   18034                 :          0 :                         iounmap(tp->regs);
   18035                 :          0 :                         tp->regs = NULL;
   18036                 :            :                 }
   18037                 :          0 :                 free_netdev(dev);
   18038                 :          0 :                 pci_release_regions(pdev);
   18039                 :          0 :                 pci_disable_device(pdev);
   18040                 :            :         }
   18041                 :          0 : }
   18042                 :            : 
   18043                 :            : #ifdef CONFIG_PM_SLEEP
   18044                 :          0 : static int tg3_suspend(struct device *device)
   18045                 :            : {
   18046                 :          0 :         struct net_device *dev = dev_get_drvdata(device);
   18047                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   18048                 :          0 :         int err = 0;
   18049                 :            : 
   18050                 :          0 :         rtnl_lock();
   18051                 :            : 
   18052         [ #  # ]:          0 :         if (!netif_running(dev))
   18053                 :          0 :                 goto unlock;
   18054                 :            : 
   18055                 :          0 :         tg3_reset_task_cancel(tp);
   18056                 :          0 :         tg3_phy_stop(tp);
   18057                 :          0 :         tg3_netif_stop(tp);
   18058                 :            : 
   18059                 :          0 :         tg3_timer_stop(tp);
   18060                 :            : 
   18061                 :          0 :         tg3_full_lock(tp, 1);
   18062                 :          0 :         tg3_disable_ints(tp);
   18063                 :          0 :         tg3_full_unlock(tp);
   18064                 :            : 
   18065                 :          0 :         netif_device_detach(dev);
   18066                 :            : 
   18067                 :          0 :         tg3_full_lock(tp, 0);
   18068                 :          0 :         tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
   18069                 :          0 :         tg3_flag_clear(tp, INIT_COMPLETE);
   18070                 :          0 :         tg3_full_unlock(tp);
   18071                 :            : 
   18072                 :          0 :         err = tg3_power_down_prepare(tp);
   18073         [ #  # ]:          0 :         if (err) {
   18074                 :          0 :                 int err2;
   18075                 :            : 
   18076                 :          0 :                 tg3_full_lock(tp, 0);
   18077                 :            : 
   18078                 :          0 :                 tg3_flag_set(tp, INIT_COMPLETE);
   18079                 :          0 :                 err2 = tg3_restart_hw(tp, true);
   18080         [ #  # ]:          0 :                 if (err2)
   18081                 :          0 :                         goto out;
   18082                 :            : 
   18083                 :          0 :                 tg3_timer_start(tp);
   18084                 :            : 
   18085                 :          0 :                 netif_device_attach(dev);
   18086                 :          0 :                 tg3_netif_start(tp);
   18087                 :            : 
   18088                 :          0 : out:
   18089                 :          0 :                 tg3_full_unlock(tp);
   18090                 :            : 
   18091         [ #  # ]:          0 :                 if (!err2)
   18092                 :          0 :                         tg3_phy_start(tp);
   18093                 :            :         }
   18094                 :            : 
   18095                 :          0 : unlock:
   18096                 :          0 :         rtnl_unlock();
   18097                 :          0 :         return err;
   18098                 :            : }
   18099                 :            : 
   18100                 :          0 : static int tg3_resume(struct device *device)
   18101                 :            : {
   18102                 :          0 :         struct net_device *dev = dev_get_drvdata(device);
   18103                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   18104                 :          0 :         int err = 0;
   18105                 :            : 
   18106                 :          0 :         rtnl_lock();
   18107                 :            : 
   18108         [ #  # ]:          0 :         if (!netif_running(dev))
   18109                 :          0 :                 goto unlock;
   18110                 :            : 
   18111                 :          0 :         netif_device_attach(dev);
   18112                 :            : 
   18113                 :          0 :         tg3_full_lock(tp, 0);
   18114                 :            : 
   18115                 :          0 :         tg3_ape_driver_state_change(tp, RESET_KIND_INIT);
   18116                 :            : 
   18117                 :          0 :         tg3_flag_set(tp, INIT_COMPLETE);
   18118                 :          0 :         err = tg3_restart_hw(tp,
   18119                 :          0 :                              !(tp->phy_flags & TG3_PHYFLG_KEEP_LINK_ON_PWRDN));
   18120         [ #  # ]:          0 :         if (err)
   18121                 :          0 :                 goto out;
   18122                 :            : 
   18123                 :          0 :         tg3_timer_start(tp);
   18124                 :            : 
   18125                 :          0 :         tg3_netif_start(tp);
   18126                 :            : 
   18127                 :          0 : out:
   18128                 :          0 :         tg3_full_unlock(tp);
   18129                 :            : 
   18130         [ #  # ]:          0 :         if (!err)
   18131                 :          0 :                 tg3_phy_start(tp);
   18132                 :            : 
   18133                 :          0 : unlock:
   18134                 :          0 :         rtnl_unlock();
   18135                 :          0 :         return err;
   18136                 :            : }
   18137                 :            : #endif /* CONFIG_PM_SLEEP */
   18138                 :            : 
   18139                 :            : static SIMPLE_DEV_PM_OPS(tg3_pm_ops, tg3_suspend, tg3_resume);
   18140                 :            : 
   18141                 :          0 : static void tg3_shutdown(struct pci_dev *pdev)
   18142                 :            : {
   18143                 :          0 :         struct net_device *dev = pci_get_drvdata(pdev);
   18144                 :          0 :         struct tg3 *tp = netdev_priv(dev);
   18145                 :            : 
   18146                 :          0 :         rtnl_lock();
   18147                 :          0 :         netif_device_detach(dev);
   18148                 :            : 
   18149         [ #  # ]:          0 :         if (netif_running(dev))
   18150                 :          0 :                 dev_close(dev);
   18151                 :            : 
   18152         [ #  # ]:          0 :         if (system_state == SYSTEM_POWER_OFF)
   18153                 :          0 :                 tg3_power_down(tp);
   18154                 :            : 
   18155                 :          0 :         rtnl_unlock();
   18156                 :          0 : }
   18157                 :            : 
   18158                 :            : /**
   18159                 :            :  * tg3_io_error_detected - called when PCI error is detected
   18160                 :            :  * @pdev: Pointer to PCI device
   18161                 :            :  * @state: The current pci connection state
   18162                 :            :  *
   18163                 :            :  * This function is called after a PCI bus error affecting
   18164                 :            :  * this device has been detected.
   18165                 :            :  */
   18166                 :          0 : static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
   18167                 :            :                                               pci_channel_state_t state)
   18168                 :            : {
   18169                 :          0 :         struct net_device *netdev = pci_get_drvdata(pdev);
   18170                 :          0 :         struct tg3 *tp = netdev_priv(netdev);
   18171                 :          0 :         pci_ers_result_t err = PCI_ERS_RESULT_NEED_RESET;
   18172                 :            : 
   18173                 :          0 :         netdev_info(netdev, "PCI I/O error detected\n");
   18174                 :            : 
   18175                 :          0 :         rtnl_lock();
   18176                 :            : 
   18177                 :            :         /* We probably don't have netdev yet */
   18178   [ #  #  #  # ]:          0 :         if (!netdev || !netif_running(netdev))
   18179                 :          0 :                 goto done;
   18180                 :            : 
   18181                 :            :         /* We needn't recover from permanent error */
   18182         [ #  # ]:          0 :         if (state == pci_channel_io_frozen)
   18183                 :          0 :                 tp->pcierr_recovery = true;
   18184                 :            : 
   18185                 :          0 :         tg3_phy_stop(tp);
   18186                 :            : 
   18187                 :          0 :         tg3_netif_stop(tp);
   18188                 :            : 
   18189                 :          0 :         tg3_timer_stop(tp);
   18190                 :            : 
   18191                 :            :         /* Want to make sure that the reset task doesn't run */
   18192                 :          0 :         tg3_reset_task_cancel(tp);
   18193                 :            : 
   18194                 :          0 :         netif_device_detach(netdev);
   18195                 :            : 
   18196                 :            :         /* Clean up software state, even if MMIO is blocked */
   18197                 :          0 :         tg3_full_lock(tp, 0);
   18198                 :          0 :         tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
   18199                 :          0 :         tg3_full_unlock(tp);
   18200                 :            : 
   18201                 :          0 : done:
   18202         [ #  # ]:          0 :         if (state == pci_channel_io_perm_failure) {
   18203         [ #  # ]:          0 :                 if (netdev) {
   18204                 :            :                         tg3_napi_enable(tp);
   18205                 :          0 :                         dev_close(netdev);
   18206                 :            :                 }
   18207                 :            :                 err = PCI_ERS_RESULT_DISCONNECT;
   18208                 :            :         } else {
   18209                 :          0 :                 pci_disable_device(pdev);
   18210                 :            :         }
   18211                 :            : 
   18212                 :          0 :         rtnl_unlock();
   18213                 :            : 
   18214                 :          0 :         return err;
   18215                 :            : }
   18216                 :            : 
   18217                 :            : /**
   18218                 :            :  * tg3_io_slot_reset - called after the pci bus has been reset.
   18219                 :            :  * @pdev: Pointer to PCI device
   18220                 :            :  *
   18221                 :            :  * Restart the card from scratch, as if from a cold-boot.
   18222                 :            :  * At this point, the card has exprienced a hard reset,
   18223                 :            :  * followed by fixups by BIOS, and has its config space
   18224                 :            :  * set up identically to what it was at cold boot.
   18225                 :            :  */
   18226                 :          0 : static pci_ers_result_t tg3_io_slot_reset(struct pci_dev *pdev)
   18227                 :            : {
   18228                 :          0 :         struct net_device *netdev = pci_get_drvdata(pdev);
   18229                 :          0 :         struct tg3 *tp = netdev_priv(netdev);
   18230                 :          0 :         pci_ers_result_t rc = PCI_ERS_RESULT_DISCONNECT;
   18231                 :          0 :         int err;
   18232                 :            : 
   18233                 :          0 :         rtnl_lock();
   18234                 :            : 
   18235         [ #  # ]:          0 :         if (pci_enable_device(pdev)) {
   18236                 :          0 :                 dev_err(&pdev->dev,
   18237                 :            :                         "Cannot re-enable PCI device after reset.\n");
   18238                 :          0 :                 goto done;
   18239                 :            :         }
   18240                 :            : 
   18241                 :          0 :         pci_set_master(pdev);
   18242                 :          0 :         pci_restore_state(pdev);
   18243                 :          0 :         pci_save_state(pdev);
   18244                 :            : 
   18245   [ #  #  #  # ]:          0 :         if (!netdev || !netif_running(netdev)) {
   18246                 :          0 :                 rc = PCI_ERS_RESULT_RECOVERED;
   18247                 :          0 :                 goto done;
   18248                 :            :         }
   18249                 :            : 
   18250                 :          0 :         err = tg3_power_up(tp);
   18251         [ #  # ]:          0 :         if (err)
   18252                 :          0 :                 goto done;
   18253                 :            : 
   18254                 :            :         rc = PCI_ERS_RESULT_RECOVERED;
   18255                 :            : 
   18256                 :          0 : done:
   18257   [ #  #  #  # ]:          0 :         if (rc != PCI_ERS_RESULT_RECOVERED && netdev && netif_running(netdev)) {
   18258                 :            :                 tg3_napi_enable(tp);
   18259                 :          0 :                 dev_close(netdev);
   18260                 :            :         }
   18261                 :          0 :         rtnl_unlock();
   18262                 :            : 
   18263                 :          0 :         return rc;
   18264                 :            : }
   18265                 :            : 
   18266                 :            : /**
   18267                 :            :  * tg3_io_resume - called when traffic can start flowing again.
   18268                 :            :  * @pdev: Pointer to PCI device
   18269                 :            :  *
   18270                 :            :  * This callback is called when the error recovery driver tells
   18271                 :            :  * us that its OK to resume normal operation.
   18272                 :            :  */
   18273                 :          0 : static void tg3_io_resume(struct pci_dev *pdev)
   18274                 :            : {
   18275                 :          0 :         struct net_device *netdev = pci_get_drvdata(pdev);
   18276                 :          0 :         struct tg3 *tp = netdev_priv(netdev);
   18277                 :          0 :         int err;
   18278                 :            : 
   18279                 :          0 :         rtnl_lock();
   18280                 :            : 
   18281   [ #  #  #  # ]:          0 :         if (!netdev || !netif_running(netdev))
   18282                 :          0 :                 goto done;
   18283                 :            : 
   18284                 :          0 :         tg3_full_lock(tp, 0);
   18285                 :          0 :         tg3_ape_driver_state_change(tp, RESET_KIND_INIT);
   18286                 :          0 :         tg3_flag_set(tp, INIT_COMPLETE);
   18287                 :          0 :         err = tg3_restart_hw(tp, true);
   18288         [ #  # ]:          0 :         if (err) {
   18289                 :          0 :                 tg3_full_unlock(tp);
   18290                 :          0 :                 netdev_err(netdev, "Cannot restart hardware after reset.\n");
   18291                 :          0 :                 goto done;
   18292                 :            :         }
   18293                 :            : 
   18294                 :          0 :         netif_device_attach(netdev);
   18295                 :            : 
   18296                 :          0 :         tg3_timer_start(tp);
   18297                 :            : 
   18298                 :          0 :         tg3_netif_start(tp);
   18299                 :            : 
   18300                 :          0 :         tg3_full_unlock(tp);
   18301                 :            : 
   18302                 :          0 :         tg3_phy_start(tp);
   18303                 :            : 
   18304                 :          0 : done:
   18305                 :          0 :         tp->pcierr_recovery = false;
   18306                 :          0 :         rtnl_unlock();
   18307                 :          0 : }
   18308                 :            : 
   18309                 :            : static const struct pci_error_handlers tg3_err_handler = {
   18310                 :            :         .error_detected = tg3_io_error_detected,
   18311                 :            :         .slot_reset     = tg3_io_slot_reset,
   18312                 :            :         .resume         = tg3_io_resume
   18313                 :            : };
   18314                 :            : 
   18315                 :            : static struct pci_driver tg3_driver = {
   18316                 :            :         .name           = DRV_MODULE_NAME,
   18317                 :            :         .id_table       = tg3_pci_tbl,
   18318                 :            :         .probe          = tg3_init_one,
   18319                 :            :         .remove         = tg3_remove_one,
   18320                 :            :         .err_handler    = &tg3_err_handler,
   18321                 :            :         .driver.pm      = &tg3_pm_ops,
   18322                 :            :         .shutdown       = tg3_shutdown,
   18323                 :            : };
   18324                 :            : 
   18325                 :         11 : module_pci_driver(tg3_driver);

Generated by: LCOV version 1.14