ar71xx/ath79: ag71xx: fix sleep in atomic
[openwrt/openwrt.git] / target / linux / ath79 / files / drivers / net / ethernet / atheros / ag71xx / ag71xx_main.c
index f03c6b40a64e24bae8fe0d7c164b7a94532b2cb1..3b2584c132e414031c8922349b801b433c797517 100644 (file)
@@ -162,7 +162,7 @@ static void ag71xx_ring_rx_clean(struct ag71xx *ag)
 
        for (i = 0; i < ring_size; i++)
                if (ring->buf[i].rx_buf) {
-                       dma_unmap_single(&ag->dev->dev, ring->buf[i].dma_addr,
+                       dma_unmap_single(&ag->pdev->dev, ring->buf[i].dma_addr,
                                         ag->rx_buf_size, DMA_FROM_DEVICE);
                        skb_free_frag(ring->buf[i].rx_buf);
                }
@@ -187,7 +187,7 @@ static bool ag71xx_fill_rx_buf(struct ag71xx *ag, struct ag71xx_buf *buf,
                return false;
 
        buf->rx_buf = data;
-       buf->dma_addr = dma_map_single(&ag->dev->dev, data, ag->rx_buf_size,
+       buf->dma_addr = dma_map_single(&ag->pdev->dev, data, ag->rx_buf_size,
                                       DMA_FROM_DEVICE);
        desc->data = (u32) buf->dma_addr + offset;
        return true;
@@ -276,7 +276,7 @@ static int ag71xx_rings_init(struct ag71xx *ag)
        if (!tx->buf)
                return -ENOMEM;
 
-       tx->descs_cpu = dma_alloc_coherent(NULL, ring_size * AG71XX_DESC_SIZE,
+       tx->descs_cpu = dma_alloc_coherent(&ag->pdev->dev, ring_size * AG71XX_DESC_SIZE,
                                           &tx->descs_dma, GFP_ATOMIC);
        if (!tx->descs_cpu) {
                kfree(tx->buf);
@@ -299,7 +299,7 @@ static void ag71xx_rings_free(struct ag71xx *ag)
        int ring_size = BIT(tx->order) + BIT(rx->order);
 
        if (tx->descs_cpu)
-               dma_free_coherent(NULL, ring_size * AG71XX_DESC_SIZE,
+               dma_free_coherent(&ag->pdev->dev, ring_size * AG71XX_DESC_SIZE,
                                  tx->descs_cpu, tx->descs_dma);
 
        kfree(tx->buf);
@@ -581,6 +581,7 @@ static void ath79_mii0_ctrl_set_if(struct ag71xx *ag)
                mii_if = AR71XX_MII0_CTRL_IF_GMII;
                break;
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
                mii_if = AR71XX_MII0_CTRL_IF_RGMII;
                break;
        case PHY_INTERFACE_MODE_RMII:
@@ -603,6 +604,7 @@ static void ath79_mii1_ctrl_set_if(struct ag71xx *ag)
                mii_if = AR71XX_MII1_CTRL_IF_RMII;
                break;
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
                mii_if = AR71XX_MII1_CTRL_IF_RGMII;
                break;
        default:
@@ -763,10 +765,6 @@ static int ag71xx_hw_enable(struct ag71xx *ag)
 
 static void ag71xx_hw_disable(struct ag71xx *ag)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&ag->lock, flags);
-
        netif_stop_queue(ag->dev);
 
        ag71xx_hw_stop(ag);
@@ -775,8 +773,6 @@ static void ag71xx_hw_disable(struct ag71xx *ag)
        napi_disable(&ag->napi);
        del_timer_sync(&ag->oom_timer);
 
-       spin_unlock_irqrestore(&ag->lock, flags);
-
        ag71xx_rings_cleanup(ag);
 }
 
@@ -892,7 +888,7 @@ static netdev_tx_t ag71xx_hard_start_xmit(struct sk_buff *skb,
                goto err_drop;
        }
 
-       dma_addr = dma_map_single(&dev->dev, skb->data, skb->len,
+       dma_addr = dma_map_single(&ag->pdev->dev, skb->data, skb->len,
                                  DMA_TO_DEVICE);
 
        i = ring->curr & ring_mask;
@@ -934,7 +930,7 @@ static netdev_tx_t ag71xx_hard_start_xmit(struct sk_buff *skb,
        return NETDEV_TX_OK;
 
 err_drop_unmap:
-       dma_unmap_single(&dev->dev, dma_addr, skb->len, DMA_TO_DEVICE);
+       dma_unmap_single(&ag->pdev->dev, dma_addr, skb->len, DMA_TO_DEVICE);
 
 err_drop:
        dev->stats.tx_dropped++;
@@ -946,18 +942,9 @@ err_drop:
 static int ag71xx_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
        struct ag71xx *ag = netdev_priv(dev);
-       int ret;
-
-       switch (cmd) {
-       case SIOCETHTOOL:
-               if (ag->phy_dev == NULL)
-                       break;
 
-               spin_lock_irq(&ag->lock);
-               ret = phy_ethtool_ioctl(ag->phy_dev, (void *) ifr->ifr_data);
-               spin_unlock_irq(&ag->lock);
-               return ret;
 
+       switch (cmd) {
        case SIOCSIFHWADDR:
                if (copy_from_user
                        (dev->dev_addr, ifr->ifr_data, sizeof(dev->dev_addr)))
@@ -1147,7 +1134,7 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit)
                pktlen = desc->ctrl & pktlen_mask;
                pktlen -= ETH_FCS_LEN;
 
-               dma_unmap_single(&dev->dev, ring->buf[i].dma_addr,
+               dma_unmap_single(&ag->pdev->dev, ring->buf[i].dma_addr,
                                 ag->rx_buf_size, DMA_FROM_DEVICE);
 
                dev->stats.rx_packets++;
@@ -1436,7 +1423,14 @@ static int ag71xx_probe(struct platform_device *pdev)
        dev->min_mtu = 68;
        dev->max_mtu = max_frame_len - ag71xx_max_frame_len(0);
 
-       if (of_device_is_compatible(np, "qca,ar7240-eth"))
+       if (of_device_is_compatible(np, "qca,ar7240-eth") ||
+           of_device_is_compatible(np, "qca,ar7241-eth") ||
+           of_device_is_compatible(np, "qca,ar7242-eth") ||
+           of_device_is_compatible(np, "qca,ar9330-eth") ||
+           of_device_is_compatible(np, "qca,ar9340-eth") ||
+           of_device_is_compatible(np, "qca,qca9530-eth") ||
+           of_device_is_compatible(np, "qca,qca9550-eth") ||
+           of_device_is_compatible(np, "qca,qca9560-eth"))
                ag->tx_hang_workaround = 1;
 
        ag->rx_buf_offset = NET_SKB_PAD;