hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/drivers/net/ethernet/cortina/gemini.c
....@@ -44,7 +44,6 @@
4444 #include "gemini.h"
4545
4646 #define DRV_NAME "gmac-gemini"
47
-#define DRV_VERSION "1.0"
4847
4948 #define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
5049 static int debug = -1;
....@@ -86,6 +85,8 @@
8685
8786 /**
8887 * struct gmac_queue_page - page buffer per-page info
88
+ * @page: the page struct
89
+ * @mapping: the dma address handle
8990 */
9091 struct gmac_queue_page {
9192 struct page *page;
....@@ -372,9 +373,8 @@
372373 return -ENODEV;
373374 netdev->phydev = phy;
374375
375
- phy->supported &= PHY_GBIT_FEATURES;
376
- phy->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause;
377
- phy->advertising = phy->supported;
376
+ phy_set_max_speed(phy, SPEED_1000);
377
+ phy_support_asym_pause(phy);
378378
379379 /* set PHY interface type */
380380 switch (phy->interface) {
....@@ -514,7 +514,6 @@
514514 .rel_threshold = 0,
515515 } };
516516 union gmac_config0 tmp;
517
- u32 val;
518517
519518 config0.bits.max_len = gmac_pick_rx_max_len(netdev->mtu);
520519 tmp.bits32 = readl(port->gmac_base + GMAC_CONFIG0);
....@@ -524,7 +523,7 @@
524523 writel(config2.bits32, port->gmac_base + GMAC_CONFIG2);
525524 writel(config3.bits32, port->gmac_base + GMAC_CONFIG3);
526525
527
- val = readl(port->dma_base + GMAC_AHB_WEIGHT_REG);
526
+ readl(port->dma_base + GMAC_AHB_WEIGHT_REG);
528527 writel(ahb_weight.bits32, port->dma_base + GMAC_AHB_WEIGHT_REG);
529528
530529 writel(hw_weigh.bits32,
....@@ -542,12 +541,6 @@
542541 port->irq_every_tx_packets = 1 << (port->txq_order - 2);
543542
544543 return 0;
545
-}
546
-
547
-static void gmac_uninit(struct net_device *netdev)
548
-{
549
- if (netdev->phydev)
550
- phy_disconnect(netdev->phydev);
551544 }
552545
553546 static int gmac_setup_txqs(struct net_device *netdev)
....@@ -1188,9 +1181,8 @@
11881181 buflen = skb_headlen(skb);
11891182 } else {
11901183 skb_frag = skb_si->frags + frag;
1191
- buffer = page_address(skb_frag_page(skb_frag)) +
1192
- skb_frag->page_offset;
1193
- buflen = skb_frag->size;
1184
+ buffer = skb_frag_address(skb_frag);
1185
+ buflen = skb_frag_size(skb_frag);
11941186 }
11951187
11961188 if (frag == last_frag) {
....@@ -1230,7 +1222,8 @@
12301222 return -ENOMEM;
12311223 }
12321224
1233
-static int gmac_start_xmit(struct sk_buff *skb, struct net_device *netdev)
1225
+static netdev_tx_t gmac_start_xmit(struct sk_buff *skb,
1226
+ struct net_device *netdev)
12341227 {
12351228 struct gemini_ethernet_port *port = netdev_priv(netdev);
12361229 unsigned short m = (1 << port->txq_order) - 1;
....@@ -1240,8 +1233,6 @@
12401233 struct gmac_txq *txq;
12411234 int txq_num, nfrags;
12421235 union dma_rwptr rw;
1243
-
1244
- SKB_FRAG_ASSERT(skb);
12451236
12461237 if (skb->len >= 0x10000)
12471238 goto out_drop_free;
....@@ -1305,7 +1296,7 @@
13051296 return NETDEV_TX_OK;
13061297 }
13071298
1308
-static void gmac_tx_timeout(struct net_device *netdev)
1299
+static void gmac_tx_timeout(struct net_device *netdev, unsigned int txqueue)
13091300 {
13101301 netdev_err(netdev, "Tx timeout\n");
13111302 gmac_dump_dma_state(netdev);
....@@ -1775,15 +1766,6 @@
17751766 struct gemini_ethernet_port *port = netdev_priv(netdev);
17761767 int err;
17771768
1778
- if (!netdev->phydev) {
1779
- err = gmac_setup_phy(netdev);
1780
- if (err) {
1781
- netif_err(port, ifup, netdev,
1782
- "PHY init failed: %d\n", err);
1783
- return err;
1784
- }
1785
- }
1786
-
17871769 err = request_irq(netdev->irq, gmac_irq,
17881770 IRQF_SHARED, netdev->name, netdev);
17891771 if (err) {
....@@ -1938,7 +1920,7 @@
19381920
19391921 /* Racing with RX NAPI */
19401922 do {
1941
- start = u64_stats_fetch_begin(&port->rx_stats_syncp);
1923
+ start = u64_stats_fetch_begin_irq(&port->rx_stats_syncp);
19421924
19431925 stats->rx_packets = port->stats.rx_packets;
19441926 stats->rx_bytes = port->stats.rx_bytes;
....@@ -1950,11 +1932,11 @@
19501932 stats->rx_crc_errors = port->stats.rx_crc_errors;
19511933 stats->rx_frame_errors = port->stats.rx_frame_errors;
19521934
1953
- } while (u64_stats_fetch_retry(&port->rx_stats_syncp, start));
1935
+ } while (u64_stats_fetch_retry_irq(&port->rx_stats_syncp, start));
19541936
19551937 /* Racing with MIB and TX completion interrupts */
19561938 do {
1957
- start = u64_stats_fetch_begin(&port->ir_stats_syncp);
1939
+ start = u64_stats_fetch_begin_irq(&port->ir_stats_syncp);
19581940
19591941 stats->tx_errors = port->stats.tx_errors;
19601942 stats->tx_packets = port->stats.tx_packets;
....@@ -1964,15 +1946,15 @@
19641946 stats->rx_missed_errors = port->stats.rx_missed_errors;
19651947 stats->rx_fifo_errors = port->stats.rx_fifo_errors;
19661948
1967
- } while (u64_stats_fetch_retry(&port->ir_stats_syncp, start));
1949
+ } while (u64_stats_fetch_retry_irq(&port->ir_stats_syncp, start));
19681950
19691951 /* Racing with hard_start_xmit */
19701952 do {
1971
- start = u64_stats_fetch_begin(&port->tx_stats_syncp);
1953
+ start = u64_stats_fetch_begin_irq(&port->tx_stats_syncp);
19721954
19731955 stats->tx_dropped = port->stats.tx_dropped;
19741956
1975
- } while (u64_stats_fetch_retry(&port->tx_stats_syncp, start));
1957
+ } while (u64_stats_fetch_retry_irq(&port->tx_stats_syncp, start));
19761958
19771959 stats->rx_dropped += stats->rx_missed_errors;
19781960 }
....@@ -2050,18 +2032,18 @@
20502032 /* Racing with MIB interrupt */
20512033 do {
20522034 p = values;
2053
- start = u64_stats_fetch_begin(&port->ir_stats_syncp);
2035
+ start = u64_stats_fetch_begin_irq(&port->ir_stats_syncp);
20542036
20552037 for (i = 0; i < RX_STATS_NUM; i++)
20562038 *p++ = port->hw_stats[i];
20572039
2058
- } while (u64_stats_fetch_retry(&port->ir_stats_syncp, start));
2040
+ } while (u64_stats_fetch_retry_irq(&port->ir_stats_syncp, start));
20592041 values = p;
20602042
20612043 /* Racing with RX NAPI */
20622044 do {
20632045 p = values;
2064
- start = u64_stats_fetch_begin(&port->rx_stats_syncp);
2046
+ start = u64_stats_fetch_begin_irq(&port->rx_stats_syncp);
20652047
20662048 for (i = 0; i < RX_STATUS_NUM; i++)
20672049 *p++ = port->rx_stats[i];
....@@ -2069,13 +2051,13 @@
20692051 *p++ = port->rx_csum_stats[i];
20702052 *p++ = port->rx_napi_exits;
20712053
2072
- } while (u64_stats_fetch_retry(&port->rx_stats_syncp, start));
2054
+ } while (u64_stats_fetch_retry_irq(&port->rx_stats_syncp, start));
20732055 values = p;
20742056
20752057 /* Racing with TX start_xmit */
20762058 do {
20772059 p = values;
2078
- start = u64_stats_fetch_begin(&port->tx_stats_syncp);
2060
+ start = u64_stats_fetch_begin_irq(&port->tx_stats_syncp);
20792061
20802062 for (i = 0; i < TX_MAX_FRAGS; i++) {
20812063 *values++ = port->tx_frag_stats[i];
....@@ -2084,7 +2066,7 @@
20842066 *values++ = port->tx_frags_linearized;
20852067 *values++ = port->tx_hw_csummed;
20862068
2087
- } while (u64_stats_fetch_retry(&port->tx_stats_syncp, start));
2069
+ } while (u64_stats_fetch_retry_irq(&port->tx_stats_syncp, start));
20882070 }
20892071
20902072 static int gmac_get_ksettings(struct net_device *netdev,
....@@ -2129,9 +2111,8 @@
21292111 struct ethtool_ringparam *rp)
21302112 {
21312113 struct gemini_ethernet_port *port = netdev_priv(netdev);
2132
- union gmac_config0 config0;
21332114
2134
- config0.bits32 = readl(port->gmac_base + GMAC_CONFIG0);
2115
+ readl(port->gmac_base + GMAC_CONFIG0);
21352116
21362117 rp->rx_max_pending = 1 << 15;
21372118 rp->rx_mini_max_pending = 0;
....@@ -2211,13 +2192,11 @@
22112192 struct ethtool_drvinfo *info)
22122193 {
22132194 strcpy(info->driver, DRV_NAME);
2214
- strcpy(info->version, DRV_VERSION);
22152195 strcpy(info->bus_info, netdev->dev_id ? "1" : "0");
22162196 }
22172197
22182198 static const struct net_device_ops gmac_351x_ops = {
22192199 .ndo_init = gmac_init,
2220
- .ndo_uninit = gmac_uninit,
22212200 .ndo_open = gmac_open,
22222201 .ndo_stop = gmac_stop,
22232202 .ndo_start_xmit = gmac_start_xmit,
....@@ -2231,6 +2210,8 @@
22312210 };
22322211
22332212 static const struct ethtool_ops gmac_351x_ethtool_ops = {
2213
+ .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS |
2214
+ ETHTOOL_COALESCE_MAX_FRAMES,
22342215 .get_sset_count = gmac_get_sset_count,
22352216 .get_strings = gmac_get_strings,
22362217 .get_ethtool_stats = gmac_get_ethtool_stats,
....@@ -2301,8 +2282,10 @@
23012282
23022283 static void gemini_port_remove(struct gemini_ethernet_port *port)
23032284 {
2304
- if (port->netdev)
2285
+ if (port->netdev) {
2286
+ phy_disconnect(port->netdev->phydev);
23052287 unregister_netdev(port->netdev);
2288
+ }
23062289 clk_disable_unprepare(port->pclk);
23072290 geth_cleanup_freeq(port->geth);
23082291 }
....@@ -2431,10 +2414,8 @@
24312414
24322415 /* Interrupt */
24332416 irq = platform_get_irq(pdev, 0);
2434
- if (irq <= 0) {
2435
- dev_err(dev, "no IRQ\n");
2417
+ if (irq <= 0)
24362418 return irq ? irq : -ENODEV;
2437
- }
24382419 port->irq = irq;
24392420
24402421 /* Clock the port */
....@@ -2513,6 +2494,13 @@
25132494 if (ret)
25142495 goto unprepare;
25152496
2497
+ ret = gmac_setup_phy(netdev);
2498
+ if (ret) {
2499
+ netdev_err(netdev,
2500
+ "PHY init failed\n");
2501
+ goto unprepare;
2502
+ }
2503
+
25162504 ret = register_netdev(netdev);
25172505 if (ret)
25182506 goto unprepare;
....@@ -2521,10 +2509,6 @@
25212509 "irq %d, DMA @ 0x%pap, GMAC @ 0x%pap\n",
25222510 port->irq, &dmares->start,
25232511 &gmacres->start);
2524
- ret = gmac_setup_phy(netdev);
2525
- if (ret)
2526
- netdev_info(netdev,
2527
- "PHY init failed, deferring to ifup time\n");
25282512 return 0;
25292513
25302514 unprepare:
....@@ -2537,6 +2521,7 @@
25372521 struct gemini_ethernet_port *port = platform_get_drvdata(pdev);
25382522
25392523 gemini_port_remove(port);
2524
+
25402525 return 0;
25412526 }
25422527