linux/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
<<
>>
Prefs
   1/*****************************************************************************
   2 *                                                                           *
   3 * File: cxgb2.c                                                             *
   4 * $Revision: 1.25 $                                                         *
   5 * $Date: 2005/06/22 00:43:25 $                                              *
   6 * Description:                                                              *
   7 *  Chelsio 10Gb Ethernet Driver.                                            *
   8 *                                                                           *
   9 * This program is free software; you can redistribute it and/or modify      *
  10 * it under the terms of the GNU General Public License, version 2, as       *
  11 * published by the Free Software Foundation.                                *
  12 *                                                                           *
  13 * You should have received a copy of the GNU General Public License along   *
  14 * with this program; if not, write to the Free Software Foundation, Inc.,   *
  15 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                 *
  16 *                                                                           *
  17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED    *
  18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF      *
  19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.                     *
  20 *                                                                           *
  21 * http://www.chelsio.com                                                    *
  22 *                                                                           *
  23 * Copyright (c) 2003 - 2005 Chelsio Communications, Inc.                    *
  24 * All rights reserved.                                                      *
  25 *                                                                           *
  26 * Maintainers: maintainers@chelsio.com                                      *
  27 *                                                                           *
  28 * Authors: Dimitrios Michailidis   <dm@chelsio.com>                         *
  29 *          Tina Yang               <tainay@chelsio.com>                     *
  30 *          Felix Marti             <felix@chelsio.com>                      *
  31 *          Scott Bardone           <sbardone@chelsio.com>                   *
  32 *          Kurt Ottaway            <kottaway@chelsio.com>                   *
  33 *          Frank DiMambro          <frank@chelsio.com>                      *
  34 *                                                                           *
  35 * History:                                                                  *
  36 *                                                                           *
  37 ****************************************************************************/
  38
  39#include "common.h"
  40#include <linux/module.h>
  41#include <linux/init.h>
  42#include <linux/pci.h>
  43#include <linux/netdevice.h>
  44#include <linux/etherdevice.h>
  45#include <linux/if_vlan.h>
  46#include <linux/mii.h>
  47#include <linux/sockios.h>
  48#include <linux/dma-mapping.h>
  49#include <asm/uaccess.h>
  50
  51#include "cpl5_cmd.h"
  52#include "regs.h"
  53#include "gmac.h"
  54#include "cphy.h"
  55#include "sge.h"
  56#include "tp.h"
  57#include "espi.h"
  58#include "elmer0.h"
  59
  60#include <linux/workqueue.h>
  61
  62static inline void schedule_mac_stats_update(struct adapter *ap, int secs)
  63{
  64        schedule_delayed_work(&ap->stats_update_task, secs * HZ);
  65}
  66
  67static inline void cancel_mac_stats_update(struct adapter *ap)
  68{
  69        cancel_delayed_work(&ap->stats_update_task);
  70}
  71
  72#define MAX_CMDQ_ENTRIES        16384
  73#define MAX_CMDQ1_ENTRIES       1024
  74#define MAX_RX_BUFFERS          16384
  75#define MAX_RX_JUMBO_BUFFERS    16384
  76#define MAX_TX_BUFFERS_HIGH     16384U
  77#define MAX_TX_BUFFERS_LOW      1536U
  78#define MAX_TX_BUFFERS          1460U
  79#define MIN_FL_ENTRIES          32
  80
  81#define DFLT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | \
  82                         NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP |\
  83                         NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
  84
  85/*
  86 * The EEPROM is actually bigger but only the first few bytes are used so we
  87 * only report those.
  88 */
  89#define EEPROM_SIZE 32
  90
  91MODULE_DESCRIPTION(DRV_DESCRIPTION);
  92MODULE_AUTHOR("Chelsio Communications");
  93MODULE_LICENSE("GPL");
  94
  95static int dflt_msg_enable = DFLT_MSG_ENABLE;
  96
  97module_param(dflt_msg_enable, int, 0);
  98MODULE_PARM_DESC(dflt_msg_enable, "Chelsio T1 default message enable bitmap");
  99
 100#define HCLOCK 0x0
 101#define LCLOCK 0x1
 102
 103/* T1 cards powersave mode */
 104static int t1_clock(struct adapter *adapter, int mode);
 105static int t1powersave = 1;     /* HW default is powersave mode. */
 106
 107module_param(t1powersave, int, 0);
 108MODULE_PARM_DESC(t1powersave, "Enable/Disable T1 powersaving mode");
 109
 110static int disable_msi = 0;
 111module_param(disable_msi, int, 0);
 112MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
 113
 114static const char pci_speed[][4] = {
 115        "33", "66", "100", "133"
 116};
 117
 118/*
 119 * Setup MAC to receive the types of packets we want.
 120 */
 121static void t1_set_rxmode(struct net_device *dev)
 122{
 123        struct adapter *adapter = dev->ml_priv;
 124        struct cmac *mac = adapter->port[dev->if_port].mac;
 125        struct t1_rx_mode rm;
 126
 127        rm.dev = dev;
 128        mac->ops->set_rx_mode(mac, &rm);
 129}
 130
 131static void link_report(struct port_info *p)
 132{
 133        if (!netif_carrier_ok(p->dev))
 134                printk(KERN_INFO "%s: link down\n", p->dev->name);
 135        else {
 136                const char *s = "10Mbps";
 137
 138                switch (p->link_config.speed) {
 139                        case SPEED_10000: s = "10Gbps"; break;
 140                        case SPEED_1000:  s = "1000Mbps"; break;
 141                        case SPEED_100:   s = "100Mbps"; break;
 142                }
 143
 144                printk(KERN_INFO "%s: link up, %s, %s-duplex\n",
 145                       p->dev->name, s,
 146                       p->link_config.duplex == DUPLEX_FULL ? "full" : "half");
 147        }
 148}
 149
 150void t1_link_negotiated(struct adapter *adapter, int port_id, int link_stat,
 151                        int speed, int duplex, int pause)
 152{
 153        struct port_info *p = &adapter->port[port_id];
 154
 155        if (link_stat != netif_carrier_ok(p->dev)) {
 156                if (link_stat)
 157                        netif_carrier_on(p->dev);
 158                else
 159                        netif_carrier_off(p->dev);
 160                link_report(p);
 161
 162                /* multi-ports: inform toe */
 163                if ((speed > 0) && (adapter->params.nports > 1)) {
 164                        unsigned int sched_speed = 10;
 165                        switch (speed) {
 166                        case SPEED_1000:
 167                                sched_speed = 1000;
 168                                break;
 169                        case SPEED_100:
 170                                sched_speed = 100;
 171                                break;
 172                        case SPEED_10:
 173                                sched_speed = 10;
 174                                break;
 175                        }
 176                        t1_sched_update_parms(adapter->sge, port_id, 0, sched_speed);
 177                }
 178        }
 179}
 180
 181static void link_start(struct port_info *p)
 182{
 183        struct cmac *mac = p->mac;
 184
 185        mac->ops->reset(mac);
 186        if (mac->ops->macaddress_set)
 187                mac->ops->macaddress_set(mac, p->dev->dev_addr);
 188        t1_set_rxmode(p->dev);
 189        t1_link_start(p->phy, mac, &p->link_config);
 190        mac->ops->enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
 191}
 192
 193static void enable_hw_csum(struct adapter *adapter)
 194{
 195        if (adapter->port[0].dev->hw_features & NETIF_F_TSO)
 196                t1_tp_set_ip_checksum_offload(adapter->tp, 1);  /* for TSO only */
 197        t1_tp_set_tcp_checksum_offload(adapter->tp, 1);
 198}
 199
 200/*
 201 * Things to do upon first use of a card.
 202 * This must run with the rtnl lock held.
 203 */
 204static int cxgb_up(struct adapter *adapter)
 205{
 206        int err = 0;
 207
 208        if (!(adapter->flags & FULL_INIT_DONE)) {
 209                err = t1_init_hw_modules(adapter);
 210                if (err)
 211                        goto out_err;
 212
 213                enable_hw_csum(adapter);
 214                adapter->flags |= FULL_INIT_DONE;
 215        }
 216
 217        t1_interrupts_clear(adapter);
 218
 219        adapter->params.has_msi = !disable_msi && !pci_enable_msi(adapter->pdev);
 220        err = request_irq(adapter->pdev->irq, t1_interrupt,
 221                          adapter->params.has_msi ? 0 : IRQF_SHARED,
 222                          adapter->name, adapter);
 223        if (err) {
 224                if (adapter->params.has_msi)
 225                        pci_disable_msi(adapter->pdev);
 226
 227                goto out_err;
 228        }
 229
 230        t1_sge_start(adapter->sge);
 231        t1_interrupts_enable(adapter);
 232out_err:
 233        return err;
 234}
 235
 236/*
 237 * Release resources when all the ports have been stopped.
 238 */
 239static void cxgb_down(struct adapter *adapter)
 240{
 241        t1_sge_stop(adapter->sge);
 242        t1_interrupts_disable(adapter);
 243        free_irq(adapter->pdev->irq, adapter);
 244        if (adapter->params.has_msi)
 245                pci_disable_msi(adapter->pdev);
 246}
 247
 248static int cxgb_open(struct net_device *dev)
 249{
 250        int err;
 251        struct adapter *adapter = dev->ml_priv;
 252        int other_ports = adapter->open_device_map & PORT_MASK;
 253
 254        napi_enable(&adapter->napi);
 255        if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) {
 256                napi_disable(&adapter->napi);
 257                return err;
 258        }
 259
 260        __set_bit(dev->if_port, &adapter->open_device_map);
 261        link_start(&adapter->port[dev->if_port]);
 262        netif_start_queue(dev);
 263        if (!other_ports && adapter->params.stats_update_period)
 264                schedule_mac_stats_update(adapter,
 265                                          adapter->params.stats_update_period);
 266
 267        t1_vlan_mode(adapter, dev->features);
 268        return 0;
 269}
 270
 271static int cxgb_close(struct net_device *dev)
 272{
 273        struct adapter *adapter = dev->ml_priv;
 274        struct port_info *p = &adapter->port[dev->if_port];
 275        struct cmac *mac = p->mac;
 276
 277        netif_stop_queue(dev);
 278        napi_disable(&adapter->napi);
 279        mac->ops->disable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
 280        netif_carrier_off(dev);
 281
 282        clear_bit(dev->if_port, &adapter->open_device_map);
 283        if (adapter->params.stats_update_period &&
 284            !(adapter->open_device_map & PORT_MASK)) {
 285                /* Stop statistics accumulation. */
 286                smp_mb__after_clear_bit();
 287                spin_lock(&adapter->work_lock);   /* sync with update task */
 288                spin_unlock(&adapter->work_lock);
 289                cancel_mac_stats_update(adapter);
 290        }
 291
 292        if (!adapter->open_device_map)
 293                cxgb_down(adapter);
 294        return 0;
 295}
 296
 297static struct net_device_stats *t1_get_stats(struct net_device *dev)
 298{
 299        struct adapter *adapter = dev->ml_priv;
 300        struct port_info *p = &adapter->port[dev->if_port];
 301        struct net_device_stats *ns = &p->netstats;
 302        const struct cmac_statistics *pstats;
 303
 304        /* Do a full update of the MAC stats */
 305        pstats = p->mac->ops->statistics_update(p->mac,
 306                                                MAC_STATS_UPDATE_FULL);
 307
 308        ns->tx_packets = pstats->TxUnicastFramesOK +
 309                pstats->TxMulticastFramesOK + pstats->TxBroadcastFramesOK;
 310
 311        ns->rx_packets = pstats->RxUnicastFramesOK +
 312                pstats->RxMulticastFramesOK + pstats->RxBroadcastFramesOK;
 313
 314        ns->tx_bytes = pstats->TxOctetsOK;
 315        ns->rx_bytes = pstats->RxOctetsOK;
 316
 317        ns->tx_errors = pstats->TxLateCollisions + pstats->TxLengthErrors +
 318                pstats->TxUnderrun + pstats->TxFramesAbortedDueToXSCollisions;
 319        ns->rx_errors = pstats->RxDataErrors + pstats->RxJabberErrors +
 320                pstats->RxFCSErrors + pstats->RxAlignErrors +
 321                pstats->RxSequenceErrors + pstats->RxFrameTooLongErrors +
 322                pstats->RxSymbolErrors + pstats->RxRuntErrors;
 323
 324        ns->multicast  = pstats->RxMulticastFramesOK;
 325        ns->collisions = pstats->TxTotalCollisions;
 326
 327        /* detailed rx_errors */
 328        ns->rx_length_errors = pstats->RxFrameTooLongErrors +
 329                pstats->RxJabberErrors;
 330        ns->rx_over_errors   = 0;
 331        ns->rx_crc_errors    = pstats->RxFCSErrors;
 332        ns->rx_frame_errors  = pstats->RxAlignErrors;
 333        ns->rx_fifo_errors   = 0;
 334        ns->rx_missed_errors = 0;
 335
 336        /* detailed tx_errors */
 337        ns->tx_aborted_errors   = pstats->TxFramesAbortedDueToXSCollisions;
 338        ns->tx_carrier_errors   = 0;
 339        ns->tx_fifo_errors      = pstats->TxUnderrun;
 340        ns->tx_heartbeat_errors = 0;
 341        ns->tx_window_errors    = pstats->TxLateCollisions;
 342        return ns;
 343}
 344
 345static u32 get_msglevel(struct net_device *dev)
 346{
 347        struct adapter *adapter = dev->ml_priv;
 348
 349        return adapter->msg_enable;
 350}
 351
 352static void set_msglevel(struct net_device *dev, u32 val)
 353{
 354        struct adapter *adapter = dev->ml_priv;
 355
 356        adapter->msg_enable = val;
 357}
 358
 359static char stats_strings[][ETH_GSTRING_LEN] = {
 360        "TxOctetsOK",
 361        "TxOctetsBad",
 362        "TxUnicastFramesOK",
 363        "TxMulticastFramesOK",
 364        "TxBroadcastFramesOK",
 365        "TxPauseFrames",
 366        "TxFramesWithDeferredXmissions",
 367        "TxLateCollisions",
 368        "TxTotalCollisions",
 369        "TxFramesAbortedDueToXSCollisions",
 370        "TxUnderrun",
 371        "TxLengthErrors",
 372        "TxInternalMACXmitError",
 373        "TxFramesWithExcessiveDeferral",
 374        "TxFCSErrors",
 375        "TxJumboFramesOk",
 376        "TxJumboOctetsOk",
 377        
 378        "RxOctetsOK",
 379        "RxOctetsBad",
 380        "RxUnicastFramesOK",
 381        "RxMulticastFramesOK",
 382        "RxBroadcastFramesOK",
 383        "RxPauseFrames",
 384        "RxFCSErrors",
 385        "RxAlignErrors",
 386        "RxSymbolErrors",
 387        "RxDataErrors",
 388        "RxSequenceErrors",
 389        "RxRuntErrors",
 390        "RxJabberErrors",
 391        "RxInternalMACRcvError",
 392        "RxInRangeLengthErrors",
 393        "RxOutOfRangeLengthField",
 394        "RxFrameTooLongErrors",
 395        "RxJumboFramesOk",
 396        "RxJumboOctetsOk",
 397
 398        /* Port stats */
 399        "RxCsumGood",
 400        "TxCsumOffload",
 401        "TxTso",
 402        "RxVlan",
 403        "TxVlan",
 404        "TxNeedHeadroom", 
 405        
 406        /* Interrupt stats */
 407        "rx drops",
 408        "pure_rsps",
 409        "unhandled irqs",
 410        "respQ_empty",
 411        "respQ_overflow",
 412        "freelistQ_empty",
 413        "pkt_too_big",
 414        "pkt_mismatch",
 415        "cmdQ_full0",
 416        "cmdQ_full1",
 417
 418        "espi_DIP2ParityErr",
 419        "espi_DIP4Err",
 420        "espi_RxDrops",
 421        "espi_TxDrops",
 422        "espi_RxOvfl",
 423        "espi_ParityErr"
 424};
 425
 426#define T2_REGMAP_SIZE (3 * 1024)
 427
 428static int get_regs_len(struct net_device *dev)
 429{
 430        return T2_REGMAP_SIZE;
 431}
 432
 433static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 434{
 435        struct adapter *adapter = dev->ml_priv;
 436
 437        strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
 438        strlcpy(info->version, DRV_VERSION, sizeof(info->version));
 439        strlcpy(info->bus_info, pci_name(adapter->pdev),
 440                sizeof(info->bus_info));
 441}
 442
 443static int get_sset_count(struct net_device *dev, int sset)
 444{
 445        switch (sset) {
 446        case ETH_SS_STATS:
 447                return ARRAY_SIZE(stats_strings);
 448        default:
 449                return -EOPNOTSUPP;
 450        }
 451}
 452
 453static void get_strings(struct net_device *dev, u32 stringset, u8 *data)
 454{
 455        if (stringset == ETH_SS_STATS)
 456                memcpy(data, stats_strings, sizeof(stats_strings));
 457}
 458
 459static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
 460                      u64 *data)
 461{
 462        struct adapter *adapter = dev->ml_priv;
 463        struct cmac *mac = adapter->port[dev->if_port].mac;
 464        const struct cmac_statistics *s;
 465        const struct sge_intr_counts *t;
 466        struct sge_port_stats ss;
 467
 468        s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL);
 469        t = t1_sge_get_intr_counts(adapter->sge);
 470        t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
 471
 472        *data++ = s->TxOctetsOK;
 473        *data++ = s->TxOctetsBad;
 474        *data++ = s->TxUnicastFramesOK;
 475        *data++ = s->TxMulticastFramesOK;
 476        *data++ = s->TxBroadcastFramesOK;
 477        *data++ = s->TxPauseFrames;
 478        *data++ = s->TxFramesWithDeferredXmissions;
 479        *data++ = s->TxLateCollisions;
 480        *data++ = s->TxTotalCollisions;
 481        *data++ = s->TxFramesAbortedDueToXSCollisions;
 482        *data++ = s->TxUnderrun;
 483        *data++ = s->TxLengthErrors;
 484        *data++ = s->TxInternalMACXmitError;
 485        *data++ = s->TxFramesWithExcessiveDeferral;
 486        *data++ = s->TxFCSErrors;
 487        *data++ = s->TxJumboFramesOK;
 488        *data++ = s->TxJumboOctetsOK;
 489
 490        *data++ = s->RxOctetsOK;
 491        *data++ = s->RxOctetsBad;
 492        *data++ = s->RxUnicastFramesOK;
 493        *data++ = s->RxMulticastFramesOK;
 494        *data++ = s->RxBroadcastFramesOK;
 495        *data++ = s->RxPauseFrames;
 496        *data++ = s->RxFCSErrors;
 497        *data++ = s->RxAlignErrors;
 498        *data++ = s->RxSymbolErrors;
 499        *data++ = s->RxDataErrors;
 500        *data++ = s->RxSequenceErrors;
 501        *data++ = s->RxRuntErrors;
 502        *data++ = s->RxJabberErrors;
 503        *data++ = s->RxInternalMACRcvError;
 504        *data++ = s->RxInRangeLengthErrors;
 505        *data++ = s->RxOutOfRangeLengthField;
 506        *data++ = s->RxFrameTooLongErrors;
 507        *data++ = s->RxJumboFramesOK;
 508        *data++ = s->RxJumboOctetsOK;
 509
 510        *data++ = ss.rx_cso_good;
 511        *data++ = ss.tx_cso;
 512        *data++ = ss.tx_tso;
 513        *data++ = ss.vlan_xtract;
 514        *data++ = ss.vlan_insert;
 515        *data++ = ss.tx_need_hdrroom;
 516        
 517        *data++ = t->rx_drops;
 518        *data++ = t->pure_rsps;
 519        *data++ = t->unhandled_irqs;
 520        *data++ = t->respQ_empty;
 521        *data++ = t->respQ_overflow;
 522        *data++ = t->freelistQ_empty;
 523        *data++ = t->pkt_too_big;
 524        *data++ = t->pkt_mismatch;
 525        *data++ = t->cmdQ_full[0];
 526        *data++ = t->cmdQ_full[1];
 527
 528        if (adapter->espi) {
 529                const struct espi_intr_counts *e;
 530
 531                e = t1_espi_get_intr_counts(adapter->espi);
 532                *data++ = e->DIP2_parity_err;
 533                *data++ = e->DIP4_err;
 534                *data++ = e->rx_drops;
 535                *data++ = e->tx_drops;
 536                *data++ = e->rx_ovflw;
 537                *data++ = e->parity_err;
 538        }
 539}
 540
 541static inline void reg_block_dump(struct adapter *ap, void *buf,
 542                                  unsigned int start, unsigned int end)
 543{
 544        u32 *p = buf + start;
 545
 546        for ( ; start <= end; start += sizeof(u32))
 547                *p++ = readl(ap->regs + start);
 548}
 549
 550static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
 551                     void *buf)
 552{
 553        struct adapter *ap = dev->ml_priv;
 554
 555        /*
 556         * Version scheme: bits 0..9: chip version, bits 10..15: chip revision
 557         */
 558        regs->version = 2;
 559
 560        memset(buf, 0, T2_REGMAP_SIZE);
 561        reg_block_dump(ap, buf, 0, A_SG_RESPACCUTIMER);
 562        reg_block_dump(ap, buf, A_MC3_CFG, A_MC4_INT_CAUSE);
 563        reg_block_dump(ap, buf, A_TPI_ADDR, A_TPI_PAR);
 564        reg_block_dump(ap, buf, A_TP_IN_CONFIG, A_TP_TX_DROP_COUNT);
 565        reg_block_dump(ap, buf, A_RAT_ROUTE_CONTROL, A_RAT_INTR_CAUSE);
 566        reg_block_dump(ap, buf, A_CSPI_RX_AE_WM, A_CSPI_INTR_ENABLE);
 567        reg_block_dump(ap, buf, A_ESPI_SCH_TOKEN0, A_ESPI_GOSTAT);
 568        reg_block_dump(ap, buf, A_ULP_ULIMIT, A_ULP_PIO_CTRL);
 569        reg_block_dump(ap, buf, A_PL_ENABLE, A_PL_CAUSE);
 570        reg_block_dump(ap, buf, A_MC5_CONFIG, A_MC5_MASK_WRITE_CMD);
 571}
 572
 573static int get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 574{
 575        struct adapter *adapter = dev->ml_priv;
 576        struct port_info *p = &adapter->port[dev->if_port];
 577
 578        cmd->supported = p->link_config.supported;
 579        cmd->advertising = p->link_config.advertising;
 580
 581        if (netif_carrier_ok(dev)) {
 582                ethtool_cmd_speed_set(cmd, p->link_config.speed);
 583                cmd->duplex = p->link_config.duplex;
 584        } else {
 585                ethtool_cmd_speed_set(cmd, -1);
 586                cmd->duplex = -1;
 587        }
 588
 589        cmd->port = (cmd->supported & SUPPORTED_TP) ? PORT_TP : PORT_FIBRE;
 590        cmd->phy_address = p->phy->mdio.prtad;
 591        cmd->transceiver = XCVR_EXTERNAL;
 592        cmd->autoneg = p->link_config.autoneg;
 593        cmd->maxtxpkt = 0;
 594        cmd->maxrxpkt = 0;
 595        return 0;
 596}
 597
 598static int speed_duplex_to_caps(int speed, int duplex)
 599{
 600        int cap = 0;
 601
 602        switch (speed) {
 603        case SPEED_10:
 604                if (duplex == DUPLEX_FULL)
 605                        cap = SUPPORTED_10baseT_Full;
 606                else
 607                        cap = SUPPORTED_10baseT_Half;
 608                break;
 609        case SPEED_100:
 610                if (duplex == DUPLEX_FULL)
 611                        cap = SUPPORTED_100baseT_Full;
 612                else
 613                        cap = SUPPORTED_100baseT_Half;
 614                break;
 615        case SPEED_1000:
 616                if (duplex == DUPLEX_FULL)
 617                        cap = SUPPORTED_1000baseT_Full;
 618                else
 619                        cap = SUPPORTED_1000baseT_Half;
 620                break;
 621        case SPEED_10000:
 622                if (duplex == DUPLEX_FULL)
 623                        cap = SUPPORTED_10000baseT_Full;
 624        }
 625        return cap;
 626}
 627
 628#define ADVERTISED_MASK (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \
 629                      ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \
 630                      ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full | \
 631                      ADVERTISED_10000baseT_Full)
 632
 633static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 634{
 635        struct adapter *adapter = dev->ml_priv;
 636        struct port_info *p = &adapter->port[dev->if_port];
 637        struct link_config *lc = &p->link_config;
 638
 639        if (!(lc->supported & SUPPORTED_Autoneg))
 640                return -EOPNOTSUPP;             /* can't change speed/duplex */
 641
 642        if (cmd->autoneg == AUTONEG_DISABLE) {
 643                u32 speed = ethtool_cmd_speed(cmd);
 644                int cap = speed_duplex_to_caps(speed, cmd->duplex);
 645
 646                if (!(lc->supported & cap) || (speed == SPEED_1000))
 647                        return -EINVAL;
 648                lc->requested_speed = speed;
 649                lc->requested_duplex = cmd->duplex;
 650                lc->advertising = 0;
 651        } else {
 652                cmd->advertising &= ADVERTISED_MASK;
 653                if (cmd->advertising & (cmd->advertising - 1))
 654                        cmd->advertising = lc->supported;
 655                cmd->advertising &= lc->supported;
 656                if (!cmd->advertising)
 657                        return -EINVAL;
 658                lc->requested_speed = SPEED_INVALID;
 659                lc->requested_duplex = DUPLEX_INVALID;
 660                lc->advertising = cmd->advertising | ADVERTISED_Autoneg;
 661        }
 662        lc->autoneg = cmd->autoneg;
 663        if (netif_running(dev))
 664                t1_link_start(p->phy, p->mac, lc);
 665        return 0;
 666}
 667
 668static void get_pauseparam(struct net_device *dev,
 669                           struct ethtool_pauseparam *epause)
 670{
 671        struct adapter *adapter = dev->ml_priv;
 672        struct port_info *p = &adapter->port[dev->if_port];
 673
 674        epause->autoneg = (p->link_config.requested_fc & PAUSE_AUTONEG) != 0;
 675        epause->rx_pause = (p->link_config.fc & PAUSE_RX) != 0;
 676        epause->tx_pause = (p->link_config.fc & PAUSE_TX) != 0;
 677}
 678
 679static int set_pauseparam(struct net_device *dev,
 680                          struct ethtool_pauseparam *epause)
 681{
 682        struct adapter *adapter = dev->ml_priv;
 683        struct port_info *p = &adapter->port[dev->if_port];
 684        struct link_config *lc = &p->link_config;
 685
 686        if (epause->autoneg == AUTONEG_DISABLE)
 687                lc->requested_fc = 0;
 688        else if (lc->supported & SUPPORTED_Autoneg)
 689                lc->requested_fc = PAUSE_AUTONEG;
 690        else
 691                return -EINVAL;
 692
 693        if (epause->rx_pause)
 694                lc->requested_fc |= PAUSE_RX;
 695        if (epause->tx_pause)
 696                lc->requested_fc |= PAUSE_TX;
 697        if (lc->autoneg == AUTONEG_ENABLE) {
 698                if (netif_running(dev))
 699                        t1_link_start(p->phy, p->mac, lc);
 700        } else {
 701                lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
 702                if (netif_running(dev))
 703                        p->mac->ops->set_speed_duplex_fc(p->mac, -1, -1,
 704                                                         lc->fc);
 705        }
 706        return 0;
 707}
 708
 709static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
 710{
 711        struct adapter *adapter = dev->ml_priv;
 712        int jumbo_fl = t1_is_T1B(adapter) ? 1 : 0;
 713
 714        e->rx_max_pending = MAX_RX_BUFFERS;
 715        e->rx_jumbo_max_pending = MAX_RX_JUMBO_BUFFERS;
 716        e->tx_max_pending = MAX_CMDQ_ENTRIES;
 717
 718        e->rx_pending = adapter->params.sge.freelQ_size[!jumbo_fl];
 719        e->rx_jumbo_pending = adapter->params.sge.freelQ_size[jumbo_fl];
 720        e->tx_pending = adapter->params.sge.cmdQ_size[0];
 721}
 722
 723static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
 724{
 725        struct adapter *adapter = dev->ml_priv;
 726        int jumbo_fl = t1_is_T1B(adapter) ? 1 : 0;
 727
 728        if (e->rx_pending > MAX_RX_BUFFERS || e->rx_mini_pending ||
 729            e->rx_jumbo_pending > MAX_RX_JUMBO_BUFFERS ||
 730            e->tx_pending > MAX_CMDQ_ENTRIES ||
 731            e->rx_pending < MIN_FL_ENTRIES ||
 732            e->rx_jumbo_pending < MIN_FL_ENTRIES ||
 733            e->tx_pending < (adapter->params.nports + 1) * (MAX_SKB_FRAGS + 1))
 734                return -EINVAL;
 735
 736        if (adapter->flags & FULL_INIT_DONE)
 737                return -EBUSY;
 738
 739        adapter->params.sge.freelQ_size[!jumbo_fl] = e->rx_pending;
 740        adapter->params.sge.freelQ_size[jumbo_fl] = e->rx_jumbo_pending;
 741        adapter->params.sge.cmdQ_size[0] = e->tx_pending;
 742        adapter->params.sge.cmdQ_size[1] = e->tx_pending > MAX_CMDQ1_ENTRIES ?
 743                MAX_CMDQ1_ENTRIES : e->tx_pending;
 744        return 0;
 745}
 746
 747static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 748{
 749        struct adapter *adapter = dev->ml_priv;
 750
 751        adapter->params.sge.rx_coalesce_usecs = c->rx_coalesce_usecs;
 752        adapter->params.sge.coalesce_enable = c->use_adaptive_rx_coalesce;
 753        adapter->params.sge.sample_interval_usecs = c->rate_sample_interval;
 754        t1_sge_set_coalesce_params(adapter->sge, &adapter->params.sge);
 755        return 0;
 756}
 757
 758static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
 759{
 760        struct adapter *adapter = dev->ml_priv;
 761
 762        c->rx_coalesce_usecs = adapter->params.sge.rx_coalesce_usecs;
 763        c->rate_sample_interval = adapter->params.sge.sample_interval_usecs;
 764        c->use_adaptive_rx_coalesce = adapter->params.sge.coalesce_enable;
 765        return 0;
 766}
 767
 768static int get_eeprom_len(struct net_device *dev)
 769{
 770        struct adapter *adapter = dev->ml_priv;
 771
 772        return t1_is_asic(adapter) ? EEPROM_SIZE : 0;
 773}
 774
 775#define EEPROM_MAGIC(ap) \
 776        (PCI_VENDOR_ID_CHELSIO | ((ap)->params.chip_version << 16))
 777
 778static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e,
 779                      u8 *data)
 780{
 781        int i;
 782        u8 buf[EEPROM_SIZE] __attribute__((aligned(4)));
 783        struct adapter *adapter = dev->ml_priv;
 784
 785        e->magic = EEPROM_MAGIC(adapter);
 786        for (i = e->offset & ~3; i < e->offset + e->len; i += sizeof(u32))
 787                t1_seeprom_read(adapter, i, (__le32 *)&buf[i]);
 788        memcpy(data, buf + e->offset, e->len);
 789        return 0;
 790}
 791
 792static const struct ethtool_ops t1_ethtool_ops = {
 793        .get_settings      = get_settings,
 794        .set_settings      = set_settings,
 795        .get_drvinfo       = get_drvinfo,
 796        .get_msglevel      = get_msglevel,
 797        .set_msglevel      = set_msglevel,
 798        .get_ringparam     = get_sge_param,
 799        .set_ringparam     = set_sge_param,
 800        .get_coalesce      = get_coalesce,
 801        .set_coalesce      = set_coalesce,
 802        .get_eeprom_len    = get_eeprom_len,
 803        .get_eeprom        = get_eeprom,
 804        .get_pauseparam    = get_pauseparam,
 805        .set_pauseparam    = set_pauseparam,
 806        .get_link          = ethtool_op_get_link,
 807        .get_strings       = get_strings,
 808        .get_sset_count    = get_sset_count,
 809        .get_ethtool_stats = get_stats,
 810        .get_regs_len      = get_regs_len,
 811        .get_regs          = get_regs,
 812};
 813
 814static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
 815{
 816        struct adapter *adapter = dev->ml_priv;
 817        struct mdio_if_info *mdio = &adapter->port[dev->if_port].phy->mdio;
 818
 819        return mdio_mii_ioctl(mdio, if_mii(req), cmd);
 820}
 821
 822static int t1_change_mtu(struct net_device *dev, int new_mtu)
 823{
 824        int ret;
 825        struct adapter *adapter = dev->ml_priv;
 826        struct cmac *mac = adapter->port[dev->if_port].mac;
 827
 828        if (!mac->ops->set_mtu)
 829                return -EOPNOTSUPP;
 830        if (new_mtu < 68)
 831                return -EINVAL;
 832        if ((ret = mac->ops->set_mtu(mac, new_mtu)))
 833                return ret;
 834        dev->mtu = new_mtu;
 835        return 0;
 836}
 837
 838static int t1_set_mac_addr(struct net_device *dev, void *p)
 839{
 840        struct adapter *adapter = dev->ml_priv;
 841        struct cmac *mac = adapter->port[dev->if_port].mac;
 842        struct sockaddr *addr = p;
 843
 844        if (!mac->ops->macaddress_set)
 845                return -EOPNOTSUPP;
 846
 847        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 848        mac->ops->macaddress_set(mac, dev->dev_addr);
 849        return 0;
 850}
 851
 852static netdev_features_t t1_fix_features(struct net_device *dev,
 853        netdev_features_t features)
 854{
 855        /*
 856         * Since there is no support for separate rx/tx vlan accel
 857         * enable/disable make sure tx flag is always in same state as rx.
 858         */
 859        if (features & NETIF_F_HW_VLAN_RX)
 860                features |= NETIF_F_HW_VLAN_TX;
 861        else
 862                features &= ~NETIF_F_HW_VLAN_TX;
 863
 864        return features;
 865}
 866
 867static int t1_set_features(struct net_device *dev, netdev_features_t features)
 868{
 869        netdev_features_t changed = dev->features ^ features;
 870        struct adapter *adapter = dev->ml_priv;
 871
 872        if (changed & NETIF_F_HW_VLAN_RX)
 873                t1_vlan_mode(adapter, features);
 874
 875        return 0;
 876}
 877#ifdef CONFIG_NET_POLL_CONTROLLER
 878static void t1_netpoll(struct net_device *dev)
 879{
 880        unsigned long flags;
 881        struct adapter *adapter = dev->ml_priv;
 882
 883        local_irq_save(flags);
 884        t1_interrupt(adapter->pdev->irq, adapter);
 885        local_irq_restore(flags);
 886}
 887#endif
 888
 889/*
 890 * Periodic accumulation of MAC statistics.  This is used only if the MAC
 891 * does not have any other way to prevent stats counter overflow.
 892 */
 893static void mac_stats_task(struct work_struct *work)
 894{
 895        int i;
 896        struct adapter *adapter =
 897                container_of(work, struct adapter, stats_update_task.work);
 898
 899        for_each_port(adapter, i) {
 900                struct port_info *p = &adapter->port[i];
 901
 902                if (netif_running(p->dev))
 903                        p->mac->ops->statistics_update(p->mac,
 904                                                       MAC_STATS_UPDATE_FAST);
 905        }
 906
 907        /* Schedule the next statistics update if any port is active. */
 908        spin_lock(&adapter->work_lock);
 909        if (adapter->open_device_map & PORT_MASK)
 910                schedule_mac_stats_update(adapter,
 911                                          adapter->params.stats_update_period);
 912        spin_unlock(&adapter->work_lock);
 913}
 914
 915/*
 916 * Processes elmer0 external interrupts in process context.
 917 */
 918static void ext_intr_task(struct work_struct *work)
 919{
 920        struct adapter *adapter =
 921                container_of(work, struct adapter, ext_intr_handler_task);
 922
 923        t1_elmer0_ext_intr_handler(adapter);
 924
 925        /* Now reenable external interrupts */
 926        spin_lock_irq(&adapter->async_lock);
 927        adapter->slow_intr_mask |= F_PL_INTR_EXT;
 928        writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE);
 929        writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA,
 930                   adapter->regs + A_PL_ENABLE);
 931        spin_unlock_irq(&adapter->async_lock);
 932}
 933
 934/*
 935 * Interrupt-context handler for elmer0 external interrupts.
 936 */
 937void t1_elmer0_ext_intr(struct adapter *adapter)
 938{
 939        /*
 940         * Schedule a task to handle external interrupts as we require
 941         * a process context.  We disable EXT interrupts in the interim
 942         * and let the task reenable them when it's done.
 943         */
 944        adapter->slow_intr_mask &= ~F_PL_INTR_EXT;
 945        writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA,
 946                   adapter->regs + A_PL_ENABLE);
 947        schedule_work(&adapter->ext_intr_handler_task);
 948}
 949
 950void t1_fatal_err(struct adapter *adapter)
 951{
 952        if (adapter->flags & FULL_INIT_DONE) {
 953                t1_sge_stop(adapter->sge);
 954                t1_interrupts_disable(adapter);
 955        }
 956        pr_alert("%s: encountered fatal error, operation suspended\n",
 957                 adapter->name);
 958}
 959
 960static const struct net_device_ops cxgb_netdev_ops = {
 961        .ndo_open               = cxgb_open,
 962        .ndo_stop               = cxgb_close,
 963        .ndo_start_xmit         = t1_start_xmit,
 964        .ndo_get_stats          = t1_get_stats,
 965        .ndo_validate_addr      = eth_validate_addr,
 966        .ndo_set_rx_mode        = t1_set_rxmode,
 967        .ndo_do_ioctl           = t1_ioctl,
 968        .ndo_change_mtu         = t1_change_mtu,
 969        .ndo_set_mac_address    = t1_set_mac_addr,
 970        .ndo_fix_features       = t1_fix_features,
 971        .ndo_set_features       = t1_set_features,
 972#ifdef CONFIG_NET_POLL_CONTROLLER
 973        .ndo_poll_controller    = t1_netpoll,
 974#endif
 975};
 976
 977static int __devinit init_one(struct pci_dev *pdev,
 978                              const struct pci_device_id *ent)
 979{
 980        static int version_printed;
 981
 982        int i, err, pci_using_dac = 0;
 983        unsigned long mmio_start, mmio_len;
 984        const struct board_info *bi;
 985        struct adapter *adapter = NULL;
 986        struct port_info *pi;
 987
 988        if (!version_printed) {
 989                printk(KERN_INFO "%s - version %s\n", DRV_DESCRIPTION,
 990                       DRV_VERSION);
 991                ++version_printed;
 992        }
 993
 994        err = pci_enable_device(pdev);
 995        if (err)
 996                return err;
 997
 998        if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
 999                pr_err("%s: cannot find PCI device memory base address\n",
1000                       pci_name(pdev));
1001                err = -ENODEV;
1002                goto out_disable_pdev;
1003        }
1004
1005        if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
1006                pci_using_dac = 1;
1007
1008                if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
1009                        pr_err("%s: unable to obtain 64-bit DMA for "
1010                               "consistent allocations\n", pci_name(pdev));
1011                        err = -ENODEV;
1012                        goto out_disable_pdev;
1013                }
1014
1015        } else if ((err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) {
1016                pr_err("%s: no usable DMA configuration\n", pci_name(pdev));
1017                goto out_disable_pdev;
1018        }
1019
1020        err = pci_request_regions(pdev, DRV_NAME);
1021        if (err) {
1022                pr_err("%s: cannot obtain PCI resources\n", pci_name(pdev));
1023                goto out_disable_pdev;
1024        }
1025
1026        pci_set_master(pdev);
1027
1028        mmio_start = pci_resource_start(pdev, 0);
1029        mmio_len = pci_resource_len(pdev, 0);
1030        bi = t1_get_board_info(ent->driver_data);
1031
1032        for (i = 0; i < bi->port_number; ++i) {
1033                struct net_device *netdev;
1034
1035                netdev = alloc_etherdev(adapter ? 0 : sizeof(*adapter));
1036                if (!netdev) {
1037                        err = -ENOMEM;
1038                        goto out_free_dev;
1039                }
1040
1041                SET_NETDEV_DEV(netdev, &pdev->dev);
1042
1043                if (!adapter) {
1044                        adapter = netdev_priv(netdev);
1045                        adapter->pdev = pdev;
1046                        adapter->port[0].dev = netdev;  /* so we don't leak it */
1047
1048                        adapter->regs = ioremap(mmio_start, mmio_len);
1049                        if (!adapter->regs) {
1050                                pr_err("%s: cannot map device registers\n",
1051                                       pci_name(pdev));
1052                                err = -ENOMEM;
1053                                goto out_free_dev;
1054                        }
1055
1056                        if (t1_get_board_rev(adapter, bi, &adapter->params)) {
1057                                err = -ENODEV;    /* Can't handle this chip rev */
1058                                goto out_free_dev;
1059                        }
1060
1061                        adapter->name = pci_name(pdev);
1062                        adapter->msg_enable = dflt_msg_enable;
1063                        adapter->mmio_len = mmio_len;
1064
1065                        spin_lock_init(&adapter->tpi_lock);
1066                        spin_lock_init(&adapter->work_lock);
1067                        spin_lock_init(&adapter->async_lock);
1068                        spin_lock_init(&adapter->mac_lock);
1069
1070                        INIT_WORK(&adapter->ext_intr_handler_task,
1071                                  ext_intr_task);
1072                        INIT_DELAYED_WORK(&adapter->stats_update_task,
1073                                          mac_stats_task);
1074
1075                        pci_set_drvdata(pdev, netdev);
1076                }
1077
1078                pi = &adapter->port[i];
1079                pi->dev = netdev;
1080                netif_carrier_off(netdev);
1081                netdev->irq = pdev->irq;
1082                netdev->if_port = i;
1083                netdev->mem_start = mmio_start;
1084                netdev->mem_end = mmio_start + mmio_len - 1;
1085                netdev->ml_priv = adapter;
1086                netdev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM |
1087                        NETIF_F_RXCSUM;
1088                netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM |
1089                        NETIF_F_RXCSUM | NETIF_F_LLTX;
1090
1091                if (pci_using_dac)
1092                        netdev->features |= NETIF_F_HIGHDMA;
1093                if (vlan_tso_capable(adapter)) {
1094                        netdev->features |=
1095                                NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
1096                        netdev->hw_features |= NETIF_F_HW_VLAN_RX;
1097
1098                        /* T204: disable TSO */
1099                        if (!(is_T2(adapter)) || bi->port_number != 4) {
1100                                netdev->hw_features |= NETIF_F_TSO;
1101                                netdev->features |= NETIF_F_TSO;
1102                        }
1103                }
1104
1105                netdev->netdev_ops = &cxgb_netdev_ops;
1106                netdev->hard_header_len += (netdev->hw_features & NETIF_F_TSO) ?
1107                        sizeof(struct cpl_tx_pkt_lso) : sizeof(struct cpl_tx_pkt);
1108
1109                netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
1110
1111                SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
1112        }
1113
1114        if (t1_init_sw_modules(adapter, bi) < 0) {
1115                err = -ENODEV;
1116                goto out_free_dev;
1117        }
1118
1119        /*
1120         * The card is now ready to go.  If any errors occur during device
1121         * registration we do not fail the whole card but rather proceed only
1122         * with the ports we manage to register successfully.  However we must
1123         * register at least one net device.
1124         */
1125        for (i = 0; i < bi->port_number; ++i) {
1126                err = register_netdev(adapter->port[i].dev);
1127                if (err)
1128                        pr_warning("%s: cannot register net device %s, skipping\n",
1129                                   pci_name(pdev), adapter->port[i].dev->name);
1130                else {
1131                        /*
1132                         * Change the name we use for messages to the name of
1133                         * the first successfully registered interface.
1134                         */
1135                        if (!adapter->registered_device_map)
1136                                adapter->name = adapter->port[i].dev->name;
1137
1138                        __set_bit(i, &adapter->registered_device_map);
1139                }
1140        }
1141        if (!adapter->registered_device_map) {
1142                pr_err("%s: could not register any net devices\n",
1143                       pci_name(pdev));
1144                goto out_release_adapter_res;
1145        }
1146
1147        printk(KERN_INFO "%s: %s (rev %d), %s %dMHz/%d-bit\n", adapter->name,
1148               bi->desc, adapter->params.chip_revision,
1149               adapter->params.pci.is_pcix ? "PCIX" : "PCI",
1150               adapter->params.pci.speed, adapter->params.pci.width);
1151
1152        /*
1153         * Set the T1B ASIC and memory clocks.
1154         */
1155        if (t1powersave)
1156                adapter->t1powersave = LCLOCK;  /* HW default is powersave mode. */
1157        else
1158                adapter->t1powersave = HCLOCK;
1159        if (t1_is_T1B(adapter))
1160                t1_clock(adapter, t1powersave);
1161
1162        return 0;
1163
1164out_release_adapter_res:
1165        t1_free_sw_modules(adapter);
1166out_free_dev:
1167        if (adapter) {
1168                if (adapter->regs)
1169                        iounmap(adapter->regs);
1170                for (i = bi->port_number - 1; i >= 0; --i)
1171                        if (adapter->port[i].dev)
1172                                free_netdev(adapter->port[i].dev);
1173        }
1174        pci_release_regions(pdev);
1175out_disable_pdev:
1176        pci_disable_device(pdev);
1177        pci_set_drvdata(pdev, NULL);
1178        return err;
1179}
1180
1181static void bit_bang(struct adapter *adapter, int bitdata, int nbits)
1182{
1183        int data;
1184        int i;
1185        u32 val;
1186
1187        enum {
1188                S_CLOCK = 1 << 3,
1189                S_DATA = 1 << 4
1190        };
1191
1192        for (i = (nbits - 1); i > -1; i--) {
1193
1194                udelay(50);
1195
1196                data = ((bitdata >> i) & 0x1);
1197                __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1198
1199                if (data)
1200                        val |= S_DATA;
1201                else
1202                        val &= ~S_DATA;
1203
1204                udelay(50);
1205
1206                /* Set SCLOCK low */
1207                val &= ~S_CLOCK;
1208                __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1209
1210                udelay(50);
1211
1212                /* Write SCLOCK high */
1213                val |= S_CLOCK;
1214                __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1215
1216        }
1217}
1218
1219static int t1_clock(struct adapter *adapter, int mode)
1220{
1221        u32 val;
1222        int M_CORE_VAL;
1223        int M_MEM_VAL;
1224
1225        enum {
1226                M_CORE_BITS     = 9,
1227                T_CORE_VAL      = 0,
1228                T_CORE_BITS     = 2,
1229                N_CORE_VAL      = 0,
1230                N_CORE_BITS     = 2,
1231                M_MEM_BITS      = 9,
1232                T_MEM_VAL       = 0,
1233                T_MEM_BITS      = 2,
1234                N_MEM_VAL       = 0,
1235                N_MEM_BITS      = 2,
1236                NP_LOAD         = 1 << 17,
1237                S_LOAD_MEM      = 1 << 5,
1238                S_LOAD_CORE     = 1 << 6,
1239                S_CLOCK         = 1 << 3
1240        };
1241
1242        if (!t1_is_T1B(adapter))
1243                return -ENODEV; /* Can't re-clock this chip. */
1244
1245        if (mode & 2)
1246                return 0;       /* show current mode. */
1247
1248        if ((adapter->t1powersave & 1) == (mode & 1))
1249                return -EALREADY;       /* ASIC already running in mode. */
1250
1251        if ((mode & 1) == HCLOCK) {
1252                M_CORE_VAL = 0x14;
1253                M_MEM_VAL = 0x18;
1254                adapter->t1powersave = HCLOCK;  /* overclock */
1255        } else {
1256                M_CORE_VAL = 0xe;
1257                M_MEM_VAL = 0x10;
1258                adapter->t1powersave = LCLOCK;  /* underclock */
1259        }
1260
1261        /* Don't interrupt this serial stream! */
1262        spin_lock(&adapter->tpi_lock);
1263
1264        /* Initialize for ASIC core */
1265        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1266        val |= NP_LOAD;
1267        udelay(50);
1268        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1269        udelay(50);
1270        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1271        val &= ~S_LOAD_CORE;
1272        val &= ~S_CLOCK;
1273        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1274        udelay(50);
1275
1276        /* Serial program the ASIC clock synthesizer */
1277        bit_bang(adapter, T_CORE_VAL, T_CORE_BITS);
1278        bit_bang(adapter, N_CORE_VAL, N_CORE_BITS);
1279        bit_bang(adapter, M_CORE_VAL, M_CORE_BITS);
1280        udelay(50);
1281
1282        /* Finish ASIC core */
1283        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1284        val |= S_LOAD_CORE;
1285        udelay(50);
1286        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1287        udelay(50);
1288        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1289        val &= ~S_LOAD_CORE;
1290        udelay(50);
1291        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1292        udelay(50);
1293
1294        /* Initialize for memory */
1295        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1296        val |= NP_LOAD;
1297        udelay(50);
1298        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1299        udelay(50);
1300        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1301        val &= ~S_LOAD_MEM;
1302        val &= ~S_CLOCK;
1303        udelay(50);
1304        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1305        udelay(50);
1306
1307        /* Serial program the memory clock synthesizer */
1308        bit_bang(adapter, T_MEM_VAL, T_MEM_BITS);
1309        bit_bang(adapter, N_MEM_VAL, N_MEM_BITS);
1310        bit_bang(adapter, M_MEM_VAL, M_MEM_BITS);
1311        udelay(50);
1312
1313        /* Finish memory */
1314        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1315        val |= S_LOAD_MEM;
1316        udelay(50);
1317        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1318        udelay(50);
1319        __t1_tpi_read(adapter, A_ELMER0_GPO, &val);
1320        val &= ~S_LOAD_MEM;
1321        udelay(50);
1322        __t1_tpi_write(adapter, A_ELMER0_GPO, val);
1323
1324        spin_unlock(&adapter->tpi_lock);
1325
1326        return 0;
1327}
1328
1329static inline void t1_sw_reset(struct pci_dev *pdev)
1330{
1331        pci_write_config_dword(pdev, A_PCICFG_PM_CSR, 3);
1332        pci_write_config_dword(pdev, A_PCICFG_PM_CSR, 0);
1333}
1334
1335static void __devexit remove_one(struct pci_dev *pdev)
1336{
1337        struct net_device *dev = pci_get_drvdata(pdev);
1338        struct adapter *adapter = dev->ml_priv;
1339        int i;
1340
1341        for_each_port(adapter, i) {
1342                if (test_bit(i, &adapter->registered_device_map))
1343                        unregister_netdev(adapter->port[i].dev);
1344        }
1345
1346        t1_free_sw_modules(adapter);
1347        iounmap(adapter->regs);
1348
1349        while (--i >= 0) {
1350                if (adapter->port[i].dev)
1351                        free_netdev(adapter->port[i].dev);
1352        }
1353
1354        pci_release_regions(pdev);
1355        pci_disable_device(pdev);
1356        pci_set_drvdata(pdev, NULL);
1357        t1_sw_reset(pdev);
1358}
1359
1360static struct pci_driver driver = {
1361        .name     = DRV_NAME,
1362        .id_table = t1_pci_tbl,
1363        .probe    = init_one,
1364        .remove   = __devexit_p(remove_one),
1365};
1366
1367static int __init t1_init_module(void)
1368{
1369        return pci_register_driver(&driver);
1370}
1371
1372static void __exit t1_cleanup_module(void)
1373{
1374        pci_unregister_driver(&driver);
1375}
1376
1377module_init(t1_init_module);
1378module_exit(t1_cleanup_module);
1379