aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/chelsio/cxgb2.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/chelsio/cxgb2.c')
-rw-r--r--drivers/net/chelsio/cxgb2.c149
1 files changed, 59 insertions, 90 deletions
diff --git a/drivers/net/chelsio/cxgb2.c b/drivers/net/chelsio/cxgb2.c
index fd5d821f3f2a..7d0f24f69777 100644
--- a/drivers/net/chelsio/cxgb2.c
+++ b/drivers/net/chelsio/cxgb2.c
@@ -69,14 +69,14 @@ static inline void cancel_mac_stats_update(struct adapter *ap)
69 cancel_delayed_work(&ap->stats_update_task); 69 cancel_delayed_work(&ap->stats_update_task);
70} 70}
71 71
72#define MAX_CMDQ_ENTRIES 16384 72#define MAX_CMDQ_ENTRIES 16384
73#define MAX_CMDQ1_ENTRIES 1024 73#define MAX_CMDQ1_ENTRIES 1024
74#define MAX_RX_BUFFERS 16384 74#define MAX_RX_BUFFERS 16384
75#define MAX_RX_JUMBO_BUFFERS 16384 75#define MAX_RX_JUMBO_BUFFERS 16384
76#define MAX_TX_BUFFERS_HIGH 16384U 76#define MAX_TX_BUFFERS_HIGH 16384U
77#define MAX_TX_BUFFERS_LOW 1536U 77#define MAX_TX_BUFFERS_LOW 1536U
78#define MAX_TX_BUFFERS 1460U 78#define MAX_TX_BUFFERS 1460U
79#define MIN_FL_ENTRIES 32 79#define MIN_FL_ENTRIES 32
80 80
81#define DFLT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | \ 81#define DFLT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK | \
82 NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP |\ 82 NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP |\
@@ -143,7 +143,7 @@ static void link_report(struct port_info *p)
143 case SPEED_100: s = "100Mbps"; break; 143 case SPEED_100: s = "100Mbps"; break;
144 } 144 }
145 145
146 printk(KERN_INFO "%s: link up, %s, %s-duplex\n", 146 printk(KERN_INFO "%s: link up, %s, %s-duplex\n",
147 p->dev->name, s, 147 p->dev->name, s,
148 p->link_config.duplex == DUPLEX_FULL ? "full" : "half"); 148 p->link_config.duplex == DUPLEX_FULL ? "full" : "half");
149 } 149 }
@@ -233,7 +233,7 @@ static int cxgb_up(struct adapter *adapter)
233 233
234 t1_sge_start(adapter->sge); 234 t1_sge_start(adapter->sge);
235 t1_interrupts_enable(adapter); 235 t1_interrupts_enable(adapter);
236 out_err: 236out_err:
237 return err; 237 return err;
238} 238}
239 239
@@ -454,51 +454,21 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
454 const struct cmac_statistics *s; 454 const struct cmac_statistics *s;
455 const struct sge_intr_counts *t; 455 const struct sge_intr_counts *t;
456 struct sge_port_stats ss; 456 struct sge_port_stats ss;
457 unsigned int len;
457 458
458 s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL); 459 s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL);
459 460
460 *data++ = s->TxOctetsOK; 461 len = sizeof(u64)*(&s->TxFCSErrors + 1 - &s->TxOctetsOK);
461 *data++ = s->TxOctetsBad; 462 memcpy(data, &s->TxOctetsOK, len);
462 *data++ = s->TxUnicastFramesOK; 463 data += len;
463 *data++ = s->TxMulticastFramesOK; 464
464 *data++ = s->TxBroadcastFramesOK; 465 len = sizeof(u64)*(&s->RxFrameTooLongErrors + 1 - &s->RxOctetsOK);
465 *data++ = s->TxPauseFrames; 466 memcpy(data, &s->RxOctetsOK, len);
466 *data++ = s->TxFramesWithDeferredXmissions; 467 data += len;
467 *data++ = s->TxLateCollisions;
468 *data++ = s->TxTotalCollisions;
469 *data++ = s->TxFramesAbortedDueToXSCollisions;
470 *data++ = s->TxUnderrun;
471 *data++ = s->TxLengthErrors;
472 *data++ = s->TxInternalMACXmitError;
473 *data++ = s->TxFramesWithExcessiveDeferral;
474 *data++ = s->TxFCSErrors;
475
476 *data++ = s->RxOctetsOK;
477 *data++ = s->RxOctetsBad;
478 *data++ = s->RxUnicastFramesOK;
479 *data++ = s->RxMulticastFramesOK;
480 *data++ = s->RxBroadcastFramesOK;
481 *data++ = s->RxPauseFrames;
482 *data++ = s->RxFCSErrors;
483 *data++ = s->RxAlignErrors;
484 *data++ = s->RxSymbolErrors;
485 *data++ = s->RxDataErrors;
486 *data++ = s->RxSequenceErrors;
487 *data++ = s->RxRuntErrors;
488 *data++ = s->RxJabberErrors;
489 *data++ = s->RxInternalMACRcvError;
490 *data++ = s->RxInRangeLengthErrors;
491 *data++ = s->RxOutOfRangeLengthField;
492 *data++ = s->RxFrameTooLongErrors;
493 468
494 t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss); 469 t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
495 *data++ = ss.rx_packets; 470 memcpy(data, &ss, sizeof(ss));
496 *data++ = ss.rx_cso_good; 471 data += sizeof(ss);
497 *data++ = ss.tx_packets;
498 *data++ = ss.tx_cso;
499 *data++ = ss.tx_tso;
500 *data++ = ss.vlan_xtract;
501 *data++ = ss.vlan_insert;
502 472
503 t = t1_sge_get_intr_counts(adapter->sge); 473 t = t1_sge_get_intr_counts(adapter->sge);
504 *data++ = t->rx_drops; 474 *data++ = t->rx_drops;
@@ -749,7 +719,7 @@ static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
749 return -EINVAL; 719 return -EINVAL;
750 720
751 if (adapter->flags & FULL_INIT_DONE) 721 if (adapter->flags & FULL_INIT_DONE)
752 return -EBUSY; 722 return -EBUSY;
753 723
754 adapter->params.sge.freelQ_size[!jumbo_fl] = e->rx_pending; 724 adapter->params.sge.freelQ_size[!jumbo_fl] = e->rx_pending;
755 adapter->params.sge.freelQ_size[jumbo_fl] = e->rx_jumbo_pending; 725 adapter->params.sge.freelQ_size[jumbo_fl] = e->rx_jumbo_pending;
@@ -764,7 +734,7 @@ static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
764 struct adapter *adapter = dev->priv; 734 struct adapter *adapter = dev->priv;
765 735
766 adapter->params.sge.rx_coalesce_usecs = c->rx_coalesce_usecs; 736 adapter->params.sge.rx_coalesce_usecs = c->rx_coalesce_usecs;
767 adapter->params.sge.coalesce_enable = c->use_adaptive_rx_coalesce; 737 adapter->params.sge.coalesce_enable = c->use_adaptive_rx_coalesce;
768 adapter->params.sge.sample_interval_usecs = c->rate_sample_interval; 738 adapter->params.sge.sample_interval_usecs = c->rate_sample_interval;
769 t1_sge_set_coalesce_params(adapter->sge, &adapter->params.sge); 739 t1_sge_set_coalesce_params(adapter->sge, &adapter->params.sge);
770 return 0; 740 return 0;
@@ -782,9 +752,9 @@ static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
782 752
783static int get_eeprom_len(struct net_device *dev) 753static int get_eeprom_len(struct net_device *dev)
784{ 754{
785 struct adapter *adapter = dev->priv; 755 struct adapter *adapter = dev->priv;
786 756
787 return t1_is_asic(adapter) ? EEPROM_SIZE : 0; 757 return t1_is_asic(adapter) ? EEPROM_SIZE : 0;
788} 758}
789 759
790#define EEPROM_MAGIC(ap) \ 760#define EEPROM_MAGIC(ap) \
@@ -848,7 +818,7 @@ static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
848 u32 val; 818 u32 val;
849 819
850 if (!phy->mdio_read) 820 if (!phy->mdio_read)
851 return -EOPNOTSUPP; 821 return -EOPNOTSUPP;
852 phy->mdio_read(adapter, data->phy_id, 0, data->reg_num & 0x1f, 822 phy->mdio_read(adapter, data->phy_id, 0, data->reg_num & 0x1f,
853 &val); 823 &val);
854 data->val_out = val; 824 data->val_out = val;
@@ -860,7 +830,7 @@ static int t1_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
860 if (!capable(CAP_NET_ADMIN)) 830 if (!capable(CAP_NET_ADMIN))
861 return -EPERM; 831 return -EPERM;
862 if (!phy->mdio_write) 832 if (!phy->mdio_write)
863 return -EOPNOTSUPP; 833 return -EOPNOTSUPP;
864 phy->mdio_write(adapter, data->phy_id, 0, data->reg_num & 0x1f, 834 phy->mdio_write(adapter, data->phy_id, 0, data->reg_num & 0x1f,
865 data->val_in); 835 data->val_in);
866 break; 836 break;
@@ -879,9 +849,9 @@ static int t1_change_mtu(struct net_device *dev, int new_mtu)
879 struct cmac *mac = adapter->port[dev->if_port].mac; 849 struct cmac *mac = adapter->port[dev->if_port].mac;
880 850
881 if (!mac->ops->set_mtu) 851 if (!mac->ops->set_mtu)
882 return -EOPNOTSUPP; 852 return -EOPNOTSUPP;
883 if (new_mtu < 68) 853 if (new_mtu < 68)
884 return -EINVAL; 854 return -EINVAL;
885 if ((ret = mac->ops->set_mtu(mac, new_mtu))) 855 if ((ret = mac->ops->set_mtu(mac, new_mtu)))
886 return ret; 856 return ret;
887 dev->mtu = new_mtu; 857 dev->mtu = new_mtu;
@@ -1211,9 +1181,9 @@ static int __devinit init_one(struct pci_dev *pdev,
1211 1181
1212 return 0; 1182 return 0;
1213 1183
1214 out_release_adapter_res: 1184out_release_adapter_res:
1215 t1_free_sw_modules(adapter); 1185 t1_free_sw_modules(adapter);
1216 out_free_dev: 1186out_free_dev:
1217 if (adapter) { 1187 if (adapter) {
1218 if (adapter->regs) 1188 if (adapter->regs)
1219 iounmap(adapter->regs); 1189 iounmap(adapter->regs);
@@ -1222,7 +1192,7 @@ static int __devinit init_one(struct pci_dev *pdev,
1222 free_netdev(adapter->port[i].dev); 1192 free_netdev(adapter->port[i].dev);
1223 } 1193 }
1224 pci_release_regions(pdev); 1194 pci_release_regions(pdev);
1225 out_disable_pdev: 1195out_disable_pdev:
1226 pci_disable_device(pdev); 1196 pci_disable_device(pdev);
1227 pci_set_drvdata(pdev, NULL); 1197 pci_set_drvdata(pdev, NULL);
1228 return err; 1198 return err;
@@ -1273,28 +1243,27 @@ static int t1_clock(struct adapter *adapter, int mode)
1273 int M_MEM_VAL; 1243 int M_MEM_VAL;
1274 1244
1275 enum { 1245 enum {
1276 M_CORE_BITS = 9, 1246 M_CORE_BITS = 9,
1277 T_CORE_VAL = 0, 1247 T_CORE_VAL = 0,
1278 T_CORE_BITS = 2, 1248 T_CORE_BITS = 2,
1279 N_CORE_VAL = 0, 1249 N_CORE_VAL = 0,
1280 N_CORE_BITS = 2, 1250 N_CORE_BITS = 2,
1281 M_MEM_BITS = 9, 1251 M_MEM_BITS = 9,
1282 T_MEM_VAL = 0, 1252 T_MEM_VAL = 0,
1283 T_MEM_BITS = 2, 1253 T_MEM_BITS = 2,
1284 N_MEM_VAL = 0, 1254 N_MEM_VAL = 0,
1285 N_MEM_BITS = 2, 1255 N_MEM_BITS = 2,
1286 NP_LOAD = 1 << 17, 1256 NP_LOAD = 1 << 17,
1287 S_LOAD_MEM = 1 << 5, 1257 S_LOAD_MEM = 1 << 5,
1288 S_LOAD_CORE = 1 << 6, 1258 S_LOAD_CORE = 1 << 6,
1289 S_CLOCK = 1 << 3 1259 S_CLOCK = 1 << 3
1290 }; 1260 };
1291 1261
1292 if (!t1_is_T1B(adapter)) 1262 if (!t1_is_T1B(adapter))
1293 return -ENODEV; /* Can't re-clock this chip. */ 1263 return -ENODEV; /* Can't re-clock this chip. */
1294 1264
1295 if (mode & 2) { 1265 if (mode & 2)
1296 return 0; /* show current mode. */ 1266 return 0; /* show current mode. */
1297 }
1298 1267
1299 if ((adapter->t1powersave & 1) == (mode & 1)) 1268 if ((adapter->t1powersave & 1) == (mode & 1))
1300 return -EALREADY; /* ASIC already running in mode. */ 1269 return -EALREADY; /* ASIC already running in mode. */
@@ -1386,26 +1355,26 @@ static inline void t1_sw_reset(struct pci_dev *pdev)
1386static void __devexit remove_one(struct pci_dev *pdev) 1355static void __devexit remove_one(struct pci_dev *pdev)
1387{ 1356{
1388 struct net_device *dev = pci_get_drvdata(pdev); 1357 struct net_device *dev = pci_get_drvdata(pdev);
1358 struct adapter *adapter = dev->priv;
1359 int i;
1389 1360
1390 if (dev) { 1361 for_each_port(adapter, i) {
1391 int i; 1362 if (test_bit(i, &adapter->registered_device_map))
1392 struct adapter *adapter = dev->priv; 1363 unregister_netdev(adapter->port[i].dev);
1393 1364 }
1394 for_each_port(adapter, i)
1395 if (test_bit(i, &adapter->registered_device_map))
1396 unregister_netdev(adapter->port[i].dev);
1397 1365
1398 t1_free_sw_modules(adapter); 1366 t1_free_sw_modules(adapter);
1399 iounmap(adapter->regs); 1367 iounmap(adapter->regs);
1400 while (--i >= 0)
1401 if (adapter->port[i].dev)
1402 free_netdev(adapter->port[i].dev);
1403 1368
1404 pci_release_regions(pdev); 1369 while (--i >= 0) {
1405 pci_disable_device(pdev); 1370 if (adapter->port[i].dev)
1406 pci_set_drvdata(pdev, NULL); 1371 free_netdev(adapter->port[i].dev);
1407 t1_sw_reset(pdev);
1408 } 1372 }
1373
1374 pci_release_regions(pdev);
1375 pci_disable_device(pdev);
1376 pci_set_drvdata(pdev, NULL);
1377 t1_sw_reset(pdev);
1409} 1378}
1410 1379
1411static struct pci_driver driver = { 1380static struct pci_driver driver = {