hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/drivers/net/ethernet/broadcom/bgmac.c
....@@ -172,7 +172,7 @@
172172 flags = 0;
173173
174174 for (i = 0; i < nr_frags; i++) {
175
- struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[i];
175
+ skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
176176 int len = skb_frag_size(frag);
177177
178178 index = (index + 1) % BGMAC_TX_RING_SLOTS;
....@@ -189,8 +189,8 @@
189189 }
190190
191191 slot->skb = skb;
192
- ring->end += nr_frags + 1;
193192 netdev_sent_queue(net_dev, skb->len);
193
+ ring->end += nr_frags + 1;
194194
195195 wmb();
196196
....@@ -616,7 +616,6 @@
616616 static const u16 ring_base[] = { BGMAC_DMA_BASE0, BGMAC_DMA_BASE1,
617617 BGMAC_DMA_BASE2, BGMAC_DMA_BASE3, };
618618 int size; /* ring size: different for Tx and Rx */
619
- int err;
620619 int i;
621620
622621 BUILD_BUG_ON(BGMAC_MAX_TX_RINGS > ARRAY_SIZE(ring_base));
....@@ -635,9 +634,9 @@
635634
636635 /* Alloc ring of descriptors */
637636 size = BGMAC_TX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
638
- ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
639
- &ring->dma_base,
640
- GFP_KERNEL);
637
+ ring->cpu_base = dma_alloc_coherent(dma_dev, size,
638
+ &ring->dma_base,
639
+ GFP_KERNEL);
641640 if (!ring->cpu_base) {
642641 dev_err(bgmac->dev, "Allocation of TX ring 0x%X failed\n",
643642 ring->mmio_base);
....@@ -660,13 +659,12 @@
660659
661660 /* Alloc ring of descriptors */
662661 size = BGMAC_RX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
663
- ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
664
- &ring->dma_base,
665
- GFP_KERNEL);
662
+ ring->cpu_base = dma_alloc_coherent(dma_dev, size,
663
+ &ring->dma_base,
664
+ GFP_KERNEL);
666665 if (!ring->cpu_base) {
667666 dev_err(bgmac->dev, "Allocation of RX ring 0x%X failed\n",
668667 ring->mmio_base);
669
- err = -ENOMEM;
670668 goto err_dma_free;
671669 }
672670
....@@ -892,13 +890,13 @@
892890
893891 if (iost & BGMAC_BCMA_IOST_ATTACHED) {
894892 flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
895
- if (!bgmac->has_robosw)
893
+ if (bgmac->in_init || !bgmac->has_robosw)
896894 flags |= BGMAC_BCMA_IOCTL_SW_RESET;
897895 }
898896 bgmac_clk_enable(bgmac, flags);
899897 }
900898
901
- if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
899
+ if (iost & BGMAC_BCMA_IOST_ATTACHED && (bgmac->in_init || !bgmac->has_robosw))
902900 bgmac_idm_write(bgmac, BCMA_IOCTL,
903901 bgmac_idm_read(bgmac, BCMA_IOCTL) &
904902 ~BGMAC_BCMA_IOCTL_SW_RESET);
....@@ -1250,12 +1248,12 @@
12501248 return 0;
12511249 }
12521250
1253
-static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
1251
+static int bgmac_change_mtu(struct net_device *net_dev, int mtu)
12541252 {
1255
- if (!netif_running(net_dev))
1256
- return -EINVAL;
1253
+ struct bgmac *bgmac = netdev_priv(net_dev);
12571254
1258
- return phy_mii_ioctl(net_dev->phydev, ifr, cmd);
1255
+ bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + mtu);
1256
+ return 0;
12591257 }
12601258
12611259 static const struct net_device_ops bgmac_netdev_ops = {
....@@ -1265,7 +1263,8 @@
12651263 .ndo_set_rx_mode = bgmac_set_rx_mode,
12661264 .ndo_set_mac_address = bgmac_set_mac_address,
12671265 .ndo_validate_addr = eth_validate_addr,
1268
- .ndo_do_ioctl = bgmac_ioctl,
1266
+ .ndo_do_ioctl = phy_do_ioctl_running,
1267
+ .ndo_change_mtu = bgmac_change_mtu,
12691268 };
12701269
12711270 /**************************************************
....@@ -1448,8 +1447,8 @@
14481447 struct phy_device *phy_dev;
14491448 int err;
14501449
1451
- phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, -1, NULL);
1452
- if (!phy_dev || IS_ERR(phy_dev)) {
1450
+ phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, NULL);
1451
+ if (IS_ERR(phy_dev)) {
14531452 dev_err(bgmac->dev, "Failed to register fixed PHY device\n");
14541453 return -ENODEV;
14551454 }
....@@ -1491,7 +1490,7 @@
14911490 struct net_device *net_dev = bgmac->net_dev;
14921491 int err;
14931492
1494
- bgmac_chip_intrs_off(bgmac);
1493
+ bgmac->in_init = true;
14951494
14961495 net_dev->irq = bgmac->irq;
14971496 SET_NETDEV_DEV(net_dev, bgmac->dev);
....@@ -1509,6 +1508,8 @@
15091508 * Broadcom does it in arch PCI code when enabling fake PCI device.
15101509 */
15111510 bgmac_clk_enable(bgmac, 0);
1511
+
1512
+ bgmac_chip_intrs_off(bgmac);
15121513
15131514 /* This seems to be fixing IRQ by assigning OOB #6 to the core */
15141515 if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
....@@ -1540,6 +1541,11 @@
15401541 net_dev->hw_features = net_dev->features;
15411542 net_dev->vlan_features = net_dev->features;
15421543
1544
+ /* Omit FCS from max MTU size */
1545
+ net_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN;
1546
+
1547
+ bgmac->in_init = false;
1548
+
15431549 err = register_netdev(bgmac->net_dev);
15441550 if (err) {
15451551 dev_err(bgmac->dev, "Cannot register net device\n");
....@@ -1566,7 +1572,6 @@
15661572 phy_disconnect(bgmac->net_dev->phydev);
15671573 netif_napi_del(&bgmac->napi);
15681574 bgmac_dma_free(bgmac);
1569
- free_netdev(bgmac->net_dev);
15701575 }
15711576 EXPORT_SYMBOL_GPL(bgmac_enet_remove);
15721577