staging: et131x: Replace kmem_cache use with plain kmalloc/kfree
authorMark Einon <mark.einon@gmail.com>
Fri, 16 Nov 2012 10:47:41 +0000 (10:47 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 Nov 2012 21:57:28 +0000 (13:57 -0800)
The use of a kmem_cache was noted as being unusual in the TODO. Replace
the kmem_cache with kmalloc/kfree so that the code is less suprising.

Also tidy up the mess that was the et131x_init_recv() out of memory
error path.

Signed-off-by: Mark Einon <mark.einon@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/et131x/README
drivers/staging/et131x/et131x.c

index 474a6f58f8dbc4d14c3c4a0a3c3b345562175ac6..38537d4c4e141ce7312ea59eb821448b92a749c7 100644 (file)
@@ -8,7 +8,6 @@ Note, the powermanagement options were removed from the vendor provided
 driver as they did not build properly at the time.
 
 TODO:
-       - Use of kmem_cache seems a bit unusual
        - some rx packets have CRC/code/frame errors
 
 Please send patches to:
index 703a874996aaca1af02f498b55d101242424eaf1..f5f8b1d97398368a05c2aa85920465fd99c0891e 100644 (file)
@@ -143,7 +143,6 @@ MODULE_DESCRIPTION("10/100/1000 Base-T Ethernet Driver for the ET1310 by Agere S
 #define fMP_DEST_BROAD                 0x00000002
 
 /* MP_ADAPTER flags */
-#define fMP_ADAPTER_RECV_LOOKASIDE     0x00000004
 #define fMP_ADAPTER_INTERRUPT_IN_USE   0x00000008
 
 /* MP_SHARED flags */
@@ -184,7 +183,6 @@ MODULE_DESCRIPTION("10/100/1000 Base-T Ethernet Driver for the ET1310 by Agere S
 #define NIC_DEFAULT_NUM_RFD    1024
 #define NUM_FBRS               2
 
-#define NIC_MIN_NUM_RFD                64
 #define NUM_PACKETS_HANDLED    256
 
 #define ALCATEL_MULTICAST_PKT  0x01000000
@@ -316,9 +314,6 @@ struct rx_ring {
        u32 num_rfd;
 
        bool unfinished_receives;
-
-       /* lookaside lists */
-       struct kmem_cache *recv_lookaside;
 };
 
 /* TX defines */
@@ -2384,21 +2379,6 @@ static int et131x_rx_dma_memory_alloc(struct et131x_adapter *adapter)
        rx_ring->num_rfd = NIC_DEFAULT_NUM_RFD;
        pr_info("PRS %llx\n", (unsigned long long)rx_ring->rx_status_bus);
 
-       /* Recv
-        * kmem_cache_create initializes a lookaside list. After successful
-        * creation, nonpaged fixed-size blocks can be allocated from and
-        * freed to the lookaside list.
-        * RFDs will be allocated from this pool.
-        */
-       rx_ring->recv_lookaside = kmem_cache_create(adapter->netdev->name,
-                                                  sizeof(struct rfd),
-                                                  0,
-                                                  SLAB_CACHE_DMA |
-                                                  SLAB_HWCACHE_ALIGN,
-                                                  NULL);
-
-       adapter->flags |= fMP_ADAPTER_RECV_LOOKASIDE;
-
        /* The RFDs are going to be put on lists later on, so initialize the
         * lists now.
         */
@@ -2431,7 +2411,7 @@ static void et131x_rx_dma_memory_free(struct et131x_adapter *adapter)
 
                list_del(&rfd->list_node);
                rfd->skb = NULL;
-               kmem_cache_free(adapter->rx_ring.recv_lookaside, rfd);
+               kfree(rfd);
        }
 
        /* Free Free Buffer Rings */
@@ -2485,12 +2465,6 @@ static void et131x_rx_dma_memory_free(struct et131x_adapter *adapter)
                rx_ring->rx_status_block = NULL;
        }
 
-       /* Destroy the lookaside (RFD) pool */
-       if (adapter->flags & fMP_ADAPTER_RECV_LOOKASIDE) {
-               kmem_cache_destroy(rx_ring->recv_lookaside);
-               adapter->flags &= ~fMP_ADAPTER_RECV_LOOKASIDE;
-       }
-
        /* Free the FBR Lookup Table */
        kfree(rx_ring->fbr[0]);
        kfree(rx_ring->fbr[1]);
@@ -2507,8 +2481,7 @@ static void et131x_rx_dma_memory_free(struct et131x_adapter *adapter)
  */
 static int et131x_init_recv(struct et131x_adapter *adapter)
 {
-       int status = -ENOMEM;
-       struct rfd *rfd = NULL;
+       struct rfd *rfd;
        u32 rfdct;
        u32 numrfd = 0;
        struct rx_ring *rx_ring;
@@ -2518,14 +2491,11 @@ static int et131x_init_recv(struct et131x_adapter *adapter)
 
        /* Setup each RFD */
        for (rfdct = 0; rfdct < rx_ring->num_rfd; rfdct++) {
-               rfd = kmem_cache_alloc(rx_ring->recv_lookaside,
-                                                    GFP_ATOMIC | GFP_DMA);
+               rfd = kzalloc(sizeof(struct rfd), GFP_ATOMIC | GFP_DMA);
 
                if (!rfd) {
-                       dev_err(&adapter->pdev->dev,
-                                 "Couldn't alloc RFD out of kmem_cache\n");
-                       status = -ENOMEM;
-                       continue;
+                       dev_err(&adapter->pdev->dev, "Couldn't alloc RFD\n");
+                       return -ENOMEM;
                }
 
                rfd->skb = NULL;
@@ -2538,17 +2508,7 @@ static int et131x_init_recv(struct et131x_adapter *adapter)
                numrfd++;
        }
 
-       if (numrfd > NIC_MIN_NUM_RFD)
-               status = 0;
-
-       rx_ring->num_rfd = numrfd;
-
-       if (status != 0) {
-               kmem_cache_free(rx_ring->recv_lookaside, rfd);
-               dev_err(&adapter->pdev->dev,
-                         "Allocation problems in et131x_init_recv\n");
-       }
-       return status;
+       return 0;
 }
 
 /**
@@ -3778,6 +3738,17 @@ static void et131x_error_timer_handler(unsigned long data)
        mod_timer(&adapter->error_timer, jiffies + TX_ERROR_PERIOD * HZ / 1000);
 }
 
+/**
+ * et131x_adapter_memory_free - Free all memory allocated for use by Tx & Rx
+ * @adapter: pointer to our private adapter structure
+ */
+static void et131x_adapter_memory_free(struct et131x_adapter *adapter)
+{
+       /* Free DMA memory */
+       et131x_tx_dma_memory_free(adapter);
+       et131x_rx_dma_memory_free(adapter);
+}
+
 /**
  * et131x_adapter_memory_alloc
  * @adapter: pointer to our private adapter structure
@@ -3808,26 +3779,14 @@ static int et131x_adapter_memory_alloc(struct et131x_adapter *adapter)
 
        /* Init receive data structures */
        status = et131x_init_recv(adapter);
-       if (status != 0) {
+       if (status) {
                dev_err(&adapter->pdev->dev,
                        "et131x_init_recv FAILED\n");
-               et131x_tx_dma_memory_free(adapter);
-               et131x_rx_dma_memory_free(adapter);
+               et131x_adapter_memory_free(adapter);
        }
        return status;
 }
 
-/**
- * et131x_adapter_memory_free - Free all memory allocated for use by Tx & Rx
- * @adapter: pointer to our private adapter structure
- */
-static void et131x_adapter_memory_free(struct et131x_adapter *adapter)
-{
-       /* Free DMA memory */
-       et131x_tx_dma_memory_free(adapter);
-       et131x_rx_dma_memory_free(adapter);
-}
-
 static void et131x_adjust_link(struct net_device *netdev)
 {
        struct et131x_adapter *adapter = netdev_priv(netdev);