[BNX2]: output driver name as prefix in error message
[powerpc.git] / drivers / net / ibmveth.c
index d985b80..be191d8 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/ioport.h>
@@ -96,7 +95,6 @@ static void ibmveth_proc_unregister_driver(void);
 static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter);
 static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter);
 static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
-static inline void ibmveth_schedule_replenishing(struct ibmveth_adapter*);
 static inline void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter);
 
 #ifdef CONFIG_PROC_FS
@@ -238,7 +236,7 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc
                lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc);
                    
                if(lpar_rc != H_Success) {
-                       pool->free_map[free_index] = IBM_VETH_INVALID_MAP;
+                       pool->free_map[free_index] = index;
                        pool->skbuff[index] = NULL;
                        pool->consumer_index--;
                        dma_unmap_single(&adapter->vdev->dev,
@@ -257,29 +255,7 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc
        atomic_add(buffers_added, &(pool->available));
 }
 
-/* check if replenishing is needed.  */
-static inline int ibmveth_is_replenishing_needed(struct ibmveth_adapter *adapter)
-{
-       int i;
-
-       for(i = 0; i < IbmVethNumBufferPools; i++)
-               if(adapter->rx_buff_pool[i].active &&
-                 (atomic_read(&adapter->rx_buff_pool[i].available) <
-                  adapter->rx_buff_pool[i].threshold))
-                       return 1;
-       return 0;
-}
-
-/* kick the replenish tasklet if we need replenishing and it isn't already running */
-static inline void ibmveth_schedule_replenishing(struct ibmveth_adapter *adapter)
-{
-       if(ibmveth_is_replenishing_needed(adapter) &&
-          (atomic_dec_if_positive(&adapter->not_replenishing) == 0)) {
-               schedule_work(&adapter->replenish_task);
-       }
-}
-
-/* replenish tasklet routine */
+/* replenish routine */
 static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) 
 {
        int i;
@@ -292,10 +268,6 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter)
                                                     &adapter->rx_buff_pool[i]);
 
        adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8);
-
-       atomic_inc(&adapter->not_replenishing);
-
-       ibmveth_schedule_replenishing(adapter);
 }
 
 /* empty and free ana buffer pool - also used to do cleanup in error paths */
@@ -303,10 +275,8 @@ static void ibmveth_free_buffer_pool(struct ibmveth_adapter *adapter, struct ibm
 {
        int i;
 
-       if(pool->free_map) {
-               kfree(pool->free_map);
-               pool->free_map  = NULL;
-       }
+       kfree(pool->free_map);
+       pool->free_map = NULL;
 
        if(pool->skbuff && pool->dma_addr) {
                for(i = 0; i < pool->size; ++i) {
@@ -543,7 +513,7 @@ static int ibmveth_open(struct net_device *netdev)
 
        if(lpar_rc != H_Success) {
                ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc);
-               ibmveth_error_printk("buffer TCE:0x%x filter TCE:0x%x rxq desc:0x%lx MAC:0x%lx\n",
+               ibmveth_error_printk("buffer TCE:0x%lx filter TCE:0x%lx rxq desc:0x%lx MAC:0x%lx\n",
                                     adapter->buffer_list_dma,
                                     adapter->filter_list_dma,
                                     rxq_desc.desc,
@@ -563,10 +533,10 @@ static int ibmveth_open(struct net_device *netdev)
                return rc;
        }
 
-       netif_start_queue(netdev);
+       ibmveth_debug_printk("initial replenish cycle\n");
+       ibmveth_interrupt(netdev->irq, netdev, NULL);
 
-       ibmveth_debug_printk("scheduling initial replenish cycle\n");
-       ibmveth_schedule_replenishing(adapter);
+       netif_start_queue(netdev);
 
        ibmveth_debug_printk("open complete\n");
 
@@ -584,9 +554,6 @@ static int ibmveth_close(struct net_device *netdev)
 
        free_irq(netdev->irq, netdev);
 
-       cancel_delayed_work(&adapter->replenish_task);
-       flush_scheduled_work();
-
        do {
                lpar_rc = h_free_logical_lan(adapter->vdev->unit_address);
        } while (H_isLongBusy(lpar_rc) || (lpar_rc == H_Busy));
@@ -651,12 +618,18 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
        unsigned long lpar_rc;
        int nfrags = 0, curfrag;
        unsigned long correlator;
+       unsigned long flags;
        unsigned int retry_count;
+       unsigned int tx_dropped = 0;
+       unsigned int tx_bytes = 0;
+       unsigned int tx_packets = 0;
+       unsigned int tx_send_failed = 0;
+       unsigned int tx_map_failed = 0;
+
 
        if ((skb_shinfo(skb)->nr_frags + 1) > IbmVethMaxSendFrags) {
-               adapter->stats.tx_dropped++;
-               dev_kfree_skb(skb);
-               return 0;
+               tx_dropped++;
+               goto out;
        }
 
        memset(&desc, 0, sizeof(desc));
@@ -675,10 +648,9 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
 
        if(dma_mapping_error(desc[0].fields.address)) {
                ibmveth_error_printk("tx: unable to map initial fragment\n");
-               adapter->tx_map_failed++;
-               adapter->stats.tx_dropped++;
-               dev_kfree_skb(skb);
-               return 0;
+               tx_map_failed++;
+               tx_dropped++;
+               goto out;
        }
 
        curfrag = nfrags;
@@ -695,8 +667,8 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
 
                if(dma_mapping_error(desc[curfrag+1].fields.address)) {
                        ibmveth_error_printk("tx: unable to map fragment %d\n", curfrag);
-                       adapter->tx_map_failed++;
-                       adapter->stats.tx_dropped++;
+                       tx_map_failed++;
+                       tx_dropped++;
                        /* Free all the mappings we just created */
                        while(curfrag < nfrags) {
                                dma_unmap_single(&adapter->vdev->dev,
@@ -705,8 +677,7 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
                                                 DMA_TO_DEVICE);
                                curfrag++;
                        }
-                       dev_kfree_skb(skb);
-                       return 0;
+                       goto out;
                }
        }
 
@@ -731,11 +702,11 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
                        ibmveth_error_printk("tx: desc[%i] valid=%d, len=%d, address=0x%d\n", i,
                                             desc[i].fields.valid, desc[i].fields.length, desc[i].fields.address);
                }
-               adapter->tx_send_failed++;
-               adapter->stats.tx_dropped++;
+               tx_send_failed++;
+               tx_dropped++;
        } else {
-               adapter->stats.tx_packets++;
-               adapter->stats.tx_bytes += skb->len;
+               tx_packets++;
+               tx_bytes += skb->len;
                netdev->trans_start = jiffies;
        }
 
@@ -745,6 +716,14 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev)
                                desc[nfrags].fields.length, DMA_TO_DEVICE);
        } while(--nfrags >= 0);
 
+out:   spin_lock_irqsave(&adapter->stats_lock, flags);
+       adapter->stats.tx_dropped += tx_dropped;
+       adapter->stats.tx_bytes += tx_bytes;
+       adapter->stats.tx_packets += tx_packets;
+       adapter->tx_send_failed += tx_send_failed;
+       adapter->tx_map_failed += tx_map_failed;
+       spin_unlock_irqrestore(&adapter->stats_lock, flags);
+
        dev_kfree_skb(skb);
        return 0;
 }
@@ -795,7 +774,7 @@ static int ibmveth_poll(struct net_device *netdev, int *budget)
                }
        } while(more_work && (frames_processed < max_frames_to_process));
 
-       ibmveth_schedule_replenishing(adapter);
+       ibmveth_replenish_task(adapter);
 
        if(more_work) {
                /* more work to do - return that we are not done yet */
@@ -931,8 +910,10 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)
 
        }
 
+       /* kick the interrupt handler so that the new buffer pools get
+          replenished or deallocated */
+       ibmveth_interrupt(dev->irq, dev, NULL);
 
-       ibmveth_schedule_replenishing(adapter);
        dev->mtu = new_mtu;
        return 0;       
 }
@@ -1008,6 +989,8 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_
        netdev->ethtool_ops           = &netdev_ethtool_ops;
        netdev->change_mtu         = ibmveth_change_mtu;
        SET_NETDEV_DEV(netdev, &dev->dev);
+       netdev->features |= NETIF_F_LLTX; 
+       spin_lock_init(&adapter->stats_lock);
 
        memcpy(&netdev->dev_addr, &adapter->mac_addr, netdev->addr_len);
 
@@ -1017,14 +1000,10 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_
 
        ibmveth_debug_printk("adapter @ 0x%p\n", adapter);
 
-       INIT_WORK(&adapter->replenish_task, (void*)ibmveth_replenish_task, (void*)adapter);
-
        adapter->buffer_list_dma = DMA_ERROR_CODE;
        adapter->filter_list_dma = DMA_ERROR_CODE;
        adapter->rx_queue.queue_dma = DMA_ERROR_CODE;
 
-       atomic_set(&adapter->not_replenishing, 1);
-
        ibmveth_debug_printk("registering netdev...\n");
 
        rc = register_netdev(netdev);
@@ -1194,14 +1173,16 @@ static struct vio_device_id ibmveth_device_table[] __devinitdata= {
        { "network", "IBM,l-lan"},
        { "", "" }
 };
-
 MODULE_DEVICE_TABLE(vio, ibmveth_device_table);
 
 static struct vio_driver ibmveth_driver = {
-       .name        = (char *)ibmveth_driver_name,
-       .id_table    = ibmveth_device_table,
-       .probe       = ibmveth_probe,
-       .remove      = ibmveth_remove
+       .id_table       = ibmveth_device_table,
+       .probe          = ibmveth_probe,
+       .remove         = ibmveth_remove,
+       .driver         = {
+               .name   = ibmveth_driver_name,
+               .owner  = THIS_MODULE,
+       }
 };
 
 static int __init ibmveth_module_init(void)