diff options
Diffstat (limited to 'drivers/net/chelsio/cxgb2.c')
-rw-r--r-- | drivers/net/chelsio/cxgb2.c | 149 |
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: | 236 | out_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 | ||
783 | static int get_eeprom_len(struct net_device *dev) | 753 | static 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: | 1184 | out_release_adapter_res: |
1215 | t1_free_sw_modules(adapter); | 1185 | t1_free_sw_modules(adapter); |
1216 | out_free_dev: | 1186 | out_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: | 1195 | out_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) | |||
1386 | static void __devexit remove_one(struct pci_dev *pdev) | 1355 | static 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 | ||
1411 | static struct pci_driver driver = { | 1380 | static struct pci_driver driver = { |