--- a/drivers/usb/net/usbnet.c  2003-09-18 23:33:11.079001376 -0400
+++ b/drivers/usb/net/usbnet.c  2003-09-18 23:41:39.314737800 -0400
@@ -455,11 +455,11 @@
 static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs)
 {
        struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context;
-       
+
        if (urb->status < 0)
                printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d",
                        urb->status);
-       
+
        kfree(req);
        usb_free_urb(urb);
 }
@@ -470,12 +470,12 @@
        struct usb_ctrlrequest *req;
        int status;
        struct urb *urb;
-       
+
        if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) {
                devdbg(dev, "Error allocating URB in write_cmd_async!");
                return;
        }
-       
+
        if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) {
                deverr(dev, "Failed to allocate memory for control request");
                usb_free_urb(urb);
@@ -510,34 +510,31 @@
        } else if (net->mc_count == 0) {
                /* just broadcast and directed */
        } else {
+               /* We use the 20 byte dev->data
+                * for our 8 byte filter buffer
+                * to avoid allocating memory that
+                * is tricky to free later */
+               u8 *multi_filter = (u8 *)dev->data;
                struct dev_mc_list *mc_list = net->mc_list;
-               u8 *multi_filter;
                u32 crc_bits;
                int i;
 
-               multi_filter = kmalloc(AX_MCAST_FILTER_SIZE, GFP_ATOMIC);
-               if (multi_filter == NULL) {
-                       /* Oops, couldn't allocate a buffer for setting the multicast
-                          filter. Try all multi mode. */
-                       rx_ctl |= 0x02;
-               } else {
-                       memset(multi_filter, 0, AX_MCAST_FILTER_SIZE);
-
-                       /* Build the multicast hash filter. */
-                       for (i = 0; i < net->mc_count; i++) {
-                               crc_bits =
-                                   ether_crc(ETH_ALEN,
-                                             mc_list->dmi_addr) >> 26;
-                               multi_filter[crc_bits >> 3] |=
-                                   1 << (crc_bits & 7);
-                               mc_list = mc_list->next;
-                       }
-
-                       ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0,
-                                          AX_MCAST_FILTER_SIZE, multi_filter);
+               memset(multi_filter, 0, AX_MCAST_FILTER_SIZE);
 
-                       rx_ctl |= 0x10;
+               /* Build the multicast hash filter. */
+               for (i = 0; i < net->mc_count; i++) {
+                       crc_bits =
+                           ether_crc(ETH_ALEN,
+                                     mc_list->dmi_addr) >> 26;
+                       multi_filter[crc_bits >> 3] |=
+                           1 << (crc_bits & 7);
+                       mc_list = mc_list->next;
                }
+
+               ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0,
+                                  AX_MCAST_FILTER_SIZE, multi_filter);
+
+               rx_ctl |= 0x10;
        }
 
        ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL);



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to