root/drivers/net/ethernet/chelsio/cxgb/cxgb2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. schedule_mac_stats_update
  2. cancel_mac_stats_update
  3. t1_set_rxmode
  4. link_report
  5. t1_link_negotiated
  6. link_start
  7. enable_hw_csum
  8. cxgb_up
  9. cxgb_down
  10. cxgb_open
  11. cxgb_close
  12. t1_get_stats
  13. get_msglevel
  14. set_msglevel
  15. get_regs_len
  16. get_drvinfo
  17. get_sset_count
  18. get_strings
  19. get_stats
  20. reg_block_dump
  21. get_regs
  22. get_link_ksettings
  23. speed_duplex_to_caps
  24. set_link_ksettings
  25. get_pauseparam
  26. set_pauseparam
  27. get_sge_param
  28. set_sge_param
  29. set_coalesce
  30. get_coalesce
  31. get_eeprom_len
  32. get_eeprom
  33. t1_ioctl
  34. t1_change_mtu
  35. t1_set_mac_addr
  36. t1_fix_features
  37. t1_set_features
  38. t1_netpoll
  39. mac_stats_task
  40. ext_intr_task
  41. t1_elmer0_ext_intr
  42. t1_fatal_err
  43. init_one
  44. bit_bang
  45. t1_clock
  46. t1_sw_reset
  47. remove_one

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

/* [<][>][^][v][top][bottom][index][help] */