]> err.no Git - linux-2.6/blobdiff - drivers/net/pasemi_mac.c
pasemi_mac: don't enable rx before there are buffers on the ring
[linux-2.6] / drivers / net / pasemi_mac.c
index 916a76e28a87d92943fc38b346c501bf8e9037d5..643fce860e5c802917fb139dbbc6c1ca767dca4e 100644 (file)
@@ -85,11 +85,6 @@ MODULE_PARM_DESC(debug, "PA Semi MAC bitmapped debugging message enable value");
 
 static struct pasdma_status *dma_status;
 
-static unsigned int read_iob_reg(struct pasemi_mac *mac, unsigned int reg)
-{
-       return in_le32(mac->iob_regs+reg);
-}
-
 static void write_iob_reg(struct pasemi_mac *mac, unsigned int reg,
                          unsigned int val)
 {
@@ -530,8 +525,8 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit)
                } else
                        skb->ip_summed = CHECKSUM_NONE;
 
-               mac->stats.rx_bytes += len;
-               mac->stats.rx_packets++;
+               mac->netdev->stats.rx_bytes += len;
+               mac->netdev->stats.rx_packets++;
 
                skb->protocol = eth_type_trans(skb, mac->netdev);
                netif_receive_skb(skb);
@@ -557,7 +552,7 @@ static int pasemi_mac_clean_tx(struct pasemi_mac *mac)
        struct pas_dma_xct_descr *dp;
        unsigned int start, count, limit;
        unsigned int total_count;
-       int flags;
+       unsigned long flags;
        struct sk_buff *skbs[32];
        dma_addr_t dmas[32];
 
@@ -791,11 +786,6 @@ static int pasemi_mac_open(struct net_device *dev)
 
        write_mac_reg(mac, PAS_MAC_CFG_TXP, flags);
 
-       flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PE |
-               PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE;
-
-       flags |= PAS_MAC_CFG_PCFG_TSR_1G | PAS_MAC_CFG_PCFG_SPD_1G;
-
        write_iob_reg(mac, PAS_IOB_DMA_RXCH_CFG(mac->dma_rxch),
                           PAS_IOB_DMA_RXCH_CFG_CNTTH(0));
 
@@ -810,8 +800,6 @@ static int pasemi_mac_open(struct net_device *dev)
        write_iob_reg(mac, PAS_IOB_DMA_COM_TIMEOUTCFG,
                           PAS_IOB_DMA_COM_TIMEOUTCFG_TCNT(0xffffff));
 
-       write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
-
        ret = pasemi_mac_setup_rx_resources(dev);
        if (ret)
                goto out_rx_resources;
@@ -839,6 +827,17 @@ static int pasemi_mac_open(struct net_device *dev)
 
        pasemi_mac_replenish_rx_ring(dev);
 
+       flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PE |
+               PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE;
+
+       if (mac->type == MAC_TYPE_GMAC)
+               flags |= PAS_MAC_CFG_PCFG_TSR_1G | PAS_MAC_CFG_PCFG_SPD_1G;
+       else
+               flags |= PAS_MAC_CFG_PCFG_TSR_10G | PAS_MAC_CFG_PCFG_SPD_10G;
+
+       /* Enable interface in MAC */
+       write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
+
        ret = pasemi_mac_phy_init(dev);
        /* Some configs don't have PHYs (XAUI etc), so don't complain about
         * failed init due to -ENODEV.
@@ -975,7 +974,7 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
        struct pas_dma_xct_descr *dp;
        u64 dflags, mactx, ptr;
        dma_addr_t map;
-       int flags;
+       unsigned long flags;
 
        dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_SS | XCT_MACTX_CRC_PAD;
 
@@ -1032,8 +1031,8 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
        info->skb = skb;
 
        txring->next_to_fill++;
-       mac->stats.tx_packets++;
-       mac->stats.tx_bytes += skb->len;
+       dev->stats.tx_packets++;
+       dev->stats.tx_bytes += skb->len;
 
        spin_unlock_irqrestore(&txring->lock, flags);
 
@@ -1047,14 +1046,6 @@ out_err:
        return NETDEV_TX_BUSY;
 }
 
-static struct net_device_stats *pasemi_mac_get_stats(struct net_device *dev)
-{
-       struct pasemi_mac *mac = netdev_priv(dev);
-
-       return &mac->stats;
-}
-
-
 static void pasemi_mac_set_rx_mode(struct net_device *dev)
 {
        struct pasemi_mac *mac = netdev_priv(dev);
@@ -1078,6 +1069,7 @@ static int pasemi_mac_poll(struct napi_struct *napi, int budget)
        struct net_device *dev = mac->netdev;
        int pkts;
 
+       pasemi_mac_clean_tx(mac);
        pkts = pasemi_mac_clean_rx(mac, budget);
        if (pkts < budget) {
                /* all done, no more packets present */
@@ -1162,6 +1154,7 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct net_device *dev;
        struct pasemi_mac *mac;
        int err;
+       DECLARE_MAC_BUF(mac_buf);
 
        err = pci_enable_device(pdev);
        if (err)
@@ -1175,7 +1168,6 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_disable_device;
        }
 
-       SET_MODULE_OWNER(dev);
        pci_set_drvdata(pdev, dev);
        SET_NETDEV_DEV(dev, &pdev->dev);
 
@@ -1223,7 +1215,6 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        dev->open = pasemi_mac_open;
        dev->stop = pasemi_mac_close;
        dev->hard_start_xmit = pasemi_mac_start_tx;
-       dev->get_stats = pasemi_mac_get_stats;
        dev->set_multicast_list = pasemi_mac_set_rx_mode;
 
        err = pasemi_mac_map_regs(mac);
@@ -1246,11 +1237,10 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out;
        } else
                printk(KERN_INFO "%s: PA Semi %s: intf %d, txch %d, rxch %d, "
-                      "hw addr %02x:%02x:%02x:%02x:%02x:%02x\n",
+                      "hw addr %s\n",
                       dev->name, mac->type == MAC_TYPE_GMAC ? "GMAC" : "XAUI",
                       mac->dma_if, mac->dma_txch, mac->dma_rxch,
-                      dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-                      dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+                      print_mac(mac_buf, dev->dev_addr));
 
        return err;